zoukankan      html  css  js  c++  java
  • 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.         });  
  • 相关阅读:
    java里如何实现对数组中的元素反转[4, 1, 8, 7, 3, 8, 2]变成 [2, 8, 3, 7, 8, 1, 4]
    牛客网Java刷题知识点之插入排序(直接插入排序和希尔排序)、选择排序(直接选择排序和堆排序)、冒泡排序、快速排序、归并排序和基数排序(博主推荐)
    [转]ASP.NET Web API对OData的支持
    [转]Work With Odata in Web API: Create Your First Odata Service
    [转]如何在 .Net Framework 4.0 项目上使用 OData?
    [转]Asp.Net Web API 2第十七课——Creating an OData Endpoint in ASP.NET Web API 2(OData终结点)
    [转]使用WCF 4.0 构建 REST Service
    [转]构建基于WCF Restful Service的服务
    [转]asp.net5中使用NLog进行日志记录
    [转]浅谈 .NET Framework 与 .NET Core 的区别与联系
  • 原文地址:https://www.cnblogs.com/xiaorenwu702/p/4352845.html
Copyright © 2011-2022 走看看