android5.0中RecycleView的用法

 最近学习了android5.0中新增的一个组件RecycleView,是用来代替当前的listview开发的,是因为在RecycleView中已经有了viewholder缓存,并且不同的item之间可以设置不同的布局。能非常有效地维护了意见数量有限,滚动大的数据集。使用 RecyclerView当你拥有的数据的集合,它的元素在运行时改变基于用户行为和网络事件的小部件

 

首先看看RecyclerView的一个小例子:

需要引入:android-support-v7-appcompat.jar

          android-v7-RecyclerView.jar来支持低版本的android系统

新建一个my_layout.xml布局文件:里边放置一个RecyclerView

 

[html] view plaincopy
 
  1. <android.support.v7.widget.RecyclerView  
  2.         android:id="@+id/rvlist"  
  3.         android:layout_width="match_parent"  
  4.         android:layout_height="match_parent"  
  5.         android:scrollbars="vertical"  
  6.         />  

 

在之前的listview开发中,我们需要自定义viewholder来缓存listView中的数据,而在RecyclerView中,已经封装好了viewholder在adapter中,接下来自定义我们的adapter

[java] view plaincopy
 
  1. public class MyAdapter2 extends RecyclerView.Adapter<MyAdapter2.ViewHolder>  
  2. {  
  3.     // 数据集  
  4.     private String[] mDataset;  
  5.   
  6.     public MyAdapter2(String[] dataset)  
  7.     {  
  8.         super();  
  9.         mDataset = dataset;  
  10.     }  
  11.   
  12.     @Override  
  13.     public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i)  
  14.     {  
  15.   
  16.         // 创建一个View,简单起见直接使用系统提供的布局,就是一个TextView  
  17.   
  18.         View view = View.inflate(viewGroup.getContext(),R.layout.viewholder_item, null);  
  19.   
  20.         // 创建一个ViewHolder  
  21.   
  22.         ViewHolder holder = new ViewHolder(view);  
  23.   
  24.         return holder;  
  25.   
  26.     }  
  27.   
  28.     @Override  
  29.     public void onBindViewHolder(ViewHolder viewHolder, int i)  
  30.     {  
  31.   
  32.         // 绑定数据到ViewHolder上  
  33.   
  34.         viewHolder.mTextView.setText(mDataset[i]);  
  35.   
  36.     }  
  37.   
  38.     @Override  
  39.     public int getItemCount()  
  40.     {  
  41.   
  42.         return mDataset.length;  
  43.   
  44.     }  
  45.   
  46.     public static class ViewHolder extends RecyclerView.ViewHolder  
  47.     {  
  48.   
  49.         public TextView mTextView;  
  50.   
  51.         public ViewHolder(View itemView)  
  52.         {  
  53.   
  54.             super(itemView);  
  55.   
  56. //          mTextView = (TextView) itemView;  
  57.             mTextView = (TextView) itemView.findViewById(R.id.view_text_id);  
  58.   
  59.         }  
  60.   
  61.     }  
  62.   
  63. }  

 

在activity这样调用,并设置adapter

[java] view plaincopy
 
  1. RecyclerView recyclerView = (RecyclerView) findViewById(R.id.rvlist);   
  2.   
  3.          // 创建一个线性布局管理器   
  4.   
  5.          LinearLayoutManager layoutManager = new LinearLayoutManager(this);   
  6.            
  7.          layoutManager.setOrientation(LinearLayoutManager.VERTICAL);  
  8.   
  9.          // 设置布局管理器   
  10.   
  11.          recyclerView.setLayoutManager(layoutManager);   
  12.   
  13.          // 创建数据集   
  14.          String[] dataset = new String[100];   
  15.   
  16.          for (int i = 0; i < dataset.length; i++){   
  17.   
  18.          dataset[i] = "item" + i;   
  19.   
  20.          }   
  21.   
  22.          // 创建Adapter,并指定数据集   
  23.   
  24.         MyAdapter2 adapter = new MyAdapter2(dataset);   
  25.   
  26.          // 设置Adapter   
  27.   
  28.          recyclerView.setAdapter(adapter);   
  29.            
  30.          }  


运行效果:

技术分享

在这个例子中只是用到了最基本的布局,下面结合android中新增的CardView和RecycleView实现一个复杂的布局:

先看效果图:

技术分享技术分享

 

CardView继承自FrameLayout,允许你在card视图中显示信息. CardView也可以设置阴影和圆角。(其实现在很多应用都自定义了Card视图,Google这回将card视图作为基本控件,可以拿来直接使用了)

Layout中为CardView设置圆角使用card_view:cardCornerRadius属性

代码中为CardView设置圆角使用CardView.setRadius方法

为CardView设置背景颜色使用card_view:cardBackgroundColor属性

 

1.在item布局中引入cardview组件

 

[html] view plaincopy
 
  1. <android.support.v7.widget.CardView  
  2.       android:id="@+id/cardview_id"  
  3.       android:layout_width="match_parent"  
  4.       android:layout_height="match_parent"  
  5.       app:cardCornerRadius="5dp"  
  6.       app:cardElevation="0dp" >  
  7.   
  8.       <RelativeLayout  
  9.           android:layout_width="match_parent"  
  10.           android:layout_height="match_parent"  
  11.           android:padding="5dp" >  
  12.   
  13.           <ImageView  
  14.               android:id="@+id/image_id"  
  15.               android:layout_width="20dp"  
  16.               android:layout_height="20dp"   
  17.               android:layout_alignParentLeft="true"  
  18.               />  
  19.   
  20.           <TextView  
  21.               android:id="@+id/text_id"  
  22.               android:layout_width="wrap_content"  
  23.               android:layout_height="match_parent"  
  24.               android:textColor="#f89ef5"  
  25.               android:textSize="20dp"  
  26.               android:layout_centerInParent="true" />  
  27.       </RelativeLayout>  
  28.   </android.support.v7.widget.CardView>  

 

 

需要注意的是要在最底层的layout中引入cardview的命名空间:

xmlns:app=http://schemas.android.com/apk/res-auto

要实现不同的item有不同的布局,需要有一个type字段来作为区分,这里,我新建一个UserInfo类,如下:

 

[java] view plaincopy
 
  1. public class UserInfo {  
  2.       
  3.     public static final int hasImage = 1;  
  4.     public static final int noImage = 2;  
  5.       
  6.     private String mUserName;  
  7.     private int userImage;  
  8.       
  9.     int type;  
  10.   
  11.     public String getmUserName() {  
  12.         return mUserName;  
  13.     }  
  14.   
  15.     public void setmUserName(String mUserName) {  
  16.         this.mUserName = mUserName;  
  17.     }  
  18.   
  19.     public int getUserImage() {  
  20.         return userImage;  
  21.     }  
  22.   
  23.     public void setUserImage(int userImage) {  
  24.         this.userImage = userImage;  
  25.     }  
  26.   
  27.     public int getType() {  
  28.         return type;  
  29.     }  
  30.   
  31.     public void setType(int type) {  
  32.         this.type = type;  
  33.     }  
  34.   
  35.     public UserInfo(String mUserName, int type) {  
  36.         this.mUserName = mUserName;  
  37.         this.type = type;  
  38.     }  
  39.   
  40.     public UserInfo(String mUserName, int userImage, int type) {  
  41.         this.mUserName = mUserName;  
  42.         this.userImage = userImage;  
  43.         this.type = type;  
  44.     }  
  45. }  

 

hasImage和noImage分别表示该item需不需要加载图片,来加载不同的布局。

接下来看看Adapter的代码:

 

[java] view plaincopy
 
  1. public class MyAdapter extends RecyclerView.Adapter<ViewHolder>{  
  2.   
  3.     private List<UserInfo>mList = null;  
  4.     private Context context = null;  
  5.   
  6.     public MyAdapter(List<UserInfo> mList, Context context) {  
  7.         super();  
  8.         this.mList = mList;  
  9.         this.context = context;  
  10.         //      for (int i = 0; i < mList.size(); i++) {  
  11.         //          Log.d("liuhang","==="+mList.get(i).getmUserName()+"==="+mList.get(i).getUserImage());  
  12.         //      }  
  13.     }  
  14.   
  15.         public void addToList(UserInfo info,int position) {  
  16.             mList.add(0, info);  
  17.             notifyItemInserted(position);  
  18.             notifyDataSetChanged();  
  19.         }  
  20.   
  21.   
  22.     public class TextOnClick implements OnClickListener {  
  23.         private int position = 0;  
  24.           
  25.         public TextOnClick(int position) {  
  26.             this.position = position;  
  27.         }  
  28.   
  29.   
  30.         @Override  
  31.         public void onClick(View v) {  
  32.             Toast.makeText(context,"text the name:"+mList.get(position).getmUserName(),1000).show();  
  33.         }  
  34.     }  
  35.       
  36.     public class ImageOnclick implements OnClickListener {  
  37.         private int position = 0;  
  38.           
  39.         public ImageOnclick(int position) {  
  40.             this.position = position;  
  41.         }  
  42.         @Override  
  43.         public void onClick(View v) {  
  44.             // TODO Auto-generated method stub  
  45.             Toast.makeText(context,"image the imageId:"+mList.get(position).getUserImage(),1000).show();  
  46.         }  
  47.     }  
  48.       
  49.     public class ItemOnClick implements OnItemClickListener {  
  50.   
  51.         @Override  
  52.         public void onItemClick(AdapterViewCompat<?> arg0, View arg1, int arg2,  
  53.                 long arg3) {  
  54.             // TODO Auto-generated method stub  
  55.             Toast.makeText(context,"you choose the item",1000).show();  
  56.         }  
  57.   
  58.     }  
  59.   
  60.   
  61.   
  62.     @Override  
  63.     public int getItemCount() {  
  64.         return mList.size();  
  65.     }  
  66.   
  67.     public class TextViewHolder extends RecyclerView.ViewHolder {  
  68.         public TextView textView = null;  
  69.         public TextViewHolder(View view) {  
  70.             super(view);  
  71.             this.textView = (TextView) view.findViewById(R.id.text_id);  
  72.         }  
  73.     }  
  74.   
  75.     public class ImageTextViewHolder extends RecyclerView.ViewHolder {  
  76.         public ImageView imageView = null;  
  77.         public TextView textView = null;  
  78.         public ImageTextViewHolder(View view) {  
  79.             super(view);  
  80.             this.imageView = (ImageView) view.findViewById(R.id.image_id);  
  81.             this.textView = (TextView) view.findViewById(R.id.text_id);  
  82.         }  
  83.   
  84.   
  85.   
  86.     }  
  87.   
  88.   
  89.   
  90.     @Override  
  91.     public int getItemViewType(int position) {  
  92.         // TODO Auto-generated method stub  
  93.         return mList.get(position).getType();  
  94.     }  
  95.   
  96.     @Override  
  97.     public void onBindViewHolder(ViewHolder holder, int position) {  
  98.         switch (getItemViewType(position)) {  
  99.         case UserInfo.hasImage:  
  100.             ImageTextViewHolder imageTextViewHolder = (ImageTextViewHolder) holder;  
  101.             imageTextViewHolder.imageView.setImageResource(mList.get(position).getUserImage());  
  102.             imageTextViewHolder.textView.setText(mList.get(position).getmUserName());  
  103.             imageTextViewHolder.textView.setOnClickListener(new TextOnClick(position));  
  104.             imageTextViewHolder.imageView.setOnClickListener(new ImageOnclick(position));  
  105.             break;  
  106.         case UserInfo.noImage:  
  107.             TextViewHolder textViewHolder = (TextViewHolder) holder;  
  108.             textViewHolder.textView.setText(mList.get(position).getmUserName());  
  109.             textViewHolder.textView.setOnClickListener(new TextOnClick(position));  
  110.         }  
  111.     }  
  112.   
  113.     @Override  
  114.     public ViewHolder onCreateViewHolder(ViewGroup parent, int type) {  
  115.         ViewHolder holder = null;  
  116.         View view = null;  
  117.         switch (type) {  
  118.         case UserInfo.hasImage:  
  119.             view = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_text_image_item,null);  
  120.             holder = new ImageTextViewHolder(view);  
  121.             break;  
  122.         case UserInfo.noImage:  
  123.             view = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_text_item,null);  
  124.             holder = new TextViewHolder(view);  
  125.             break;  
  126.         }  
  127. <a target=_blank href="http://download.csdn.net/detail/mockingbirds/8312357">源码下载</a>  
  128.         return holder;  
  129.     }  
  130.   
  131. }  


在activity中这样调用:

 

 

[java] view plaincopy
 
    1. RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_id);  
    2.         recyclerView.setHasFixedSize(true);  
    3.           
    4.         LinearLayoutManager linaLayout = new LinearLayoutManager(this);  
    5.         linaLayout.setOrientation(1);  
    6.           
    7.         recyclerView.setLayoutManager(linaLayout);  
    8.           
    9.         recyclerView.getRecycledViewPool().setMaxRecycledViews(0, 10);  
    10.           
    11.         int[]userImage = {R.drawable.icon08,R.drawable.icon00,R.drawable.icon01,  
    12.                                   R.drawable.icon02,R.drawable.icon03,R.drawable.icon04,  
    13.                                   R.drawable.icon05,R.drawable.icon06,R.drawable.icon07};  
    14.           
    15.         List<UserInfo>userList = new ArrayList<UserInfo>();  
    16.           
    17.         int position = 0;  
    18.         for (int i = 0; i < 35; i++) {  
    19.             position = (int) (Math.random() * 8);  
    20.             UserInfo userInfo1 = new UserInfo("zhangsan"+i,2);  
    21.             UserInfo userInfo2 = new UserInfo("lisi"+i,userImage[position],1);  
    22.             userList.add(userInfo1);  
    23.             userList.add(userInfo2);  
    24.         }  
    25.           
    26.         final MyAdapter adapter= new MyAdapter(userList, this);  
    27.         recyclerView.setAdapter(adapter);  
    28.           
    29.         recyclerView.setOnClickListener(new OnClickListener() {  
    30.               
    31.             @Override  
    32.             public void onClick(View v) {  
    33.                 // TODO Auto-generated method stub  
    34.                 Toast.makeText(MyActivity.this,"you choose the item",1000).show();  
    35.             }  
    36.         });  
    37.           
    38.         Button button = (Button) findViewById(R.id.add);  
    39.         button.setOnClickListener(new OnClickListener() {  
    40.               
    41.             @Override  
    42.             public void onClick(View v) {  
    43.                 adapter.addToList(new UserInfo("new add"+ newAdd++, 2),0);  
    44.             }  
    45.         });  

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。