这个题目放在草稿箱里面许久了,一直没有动力提笔。趁现在公司人还没有来齐,工作量还不是很大,就挤出来时间来把它完善了。

 

我们知道,RecyclerView是经典的ListView的进化与升华,它比ListView更加灵活,但也因此引入了一定的复杂性。最新的v7支持包新添加了RecyclerView。

我们知道,ListView通过使用ViewHolder来提升性能。ViewHolder通过保存item中使用到的控件的引用来减少findViewById的调用,以此使ListView滑动得更加顺畅。但这种模式即使不使用也无妨。

对于还不是很熟悉RecyclerView的程序员,可以先从这两篇文章里面了解一下它的基本用法:

Android L新控件RecyclerView简介

RecyclerView和CardView简介

这里对RecyclerView的基本使用方式,就不再赘述,只讨论RecyclerView中的ViewHolder的缓存机制。其实它的缓存机制大致原理跟ListView是相似的,只是在具体的实现细节上面有些差异。对于这些RecyclerView的缓存机制,Android L新控件RecyclerView简介这篇文章的结尾进行了总结性的概括,这里讨论的内容要远比这篇简介的内容要复杂和多。

首先,我定义了三个不同的Adapter,里面分别对应了三种情况:item类型只有一种;item类型有两种;item类型有三种。里面均重写了onCreateViewHolder方法,用于记录生成的ViewHolder或者View的数目。内容可以从Log里面查询得到。三个Adapter的细节分别是:

  1 /**   
  2  * @Title: MyRVAdapter.java 
  3  * @Package com.example.recyclerviewtest.adapter 
  4  * @Description: TODO
  5  * @author SilentKnight || happychinapc[at]gmail[dot]com   
  6  * @date 2015 2015年1月22日 下午4:54:25 
  7  * @version V1.0.0   
  8  */
  9 package com.example.recyclerviewtest.adapter;
 10 
 11 import java.util.List;
 12 
 13 import android.content.Context;
 14 import android.support.v7.widget.RecyclerView;
 15 import android.util.Log;
 16 import android.view.LayoutInflater;
 17 import android.view.View;
 18 import android.view.ViewGroup;
 19 import android.view.View.OnClickListener;
 20 import android.widget.TextView;
 21 import android.widget.Toast;
 22 
 23 import com.example.recyclerviewtest.R;
 24 
 25 /**
 26  * @ClassName: MyRVAdapter
 27  * @Description: TODO
 28  * @author SilentKnight || happychinapc@gmail.com
 29  * @date 2015年1月22日 下午4:54:25
 30  * 
 31  */
 32 public class MyRVAdapter extends RecyclerView.Adapter<MyRVAdapter.ViewHolder> {
 33     private static int COUNT_CACHE_VIEW = 0;
 34     private static final String ADAPTER_TAG = MyRVAdapter.class.getSimpleName();
 35     private List<String> dataSet;
 36     private Context context;
 37 
 38     public MyRVAdapter(Context context, List<String> dataSet) {
 39         this.context = context;
 40         this.dataSet = dataSet;
 41     }
 42 
 43     /*
 44      * (non-avadoc) <p>Title: getItemId</p> <p>Description: </p>
 45      * 
 46      * @params @param position
 47      * 
 48      * @params @return
 49      * 
 50      * @overrided @see
 51      * android.support.v7.widget.RecyclerView.Adapter#getItemId(int)
 52      */
 53     @Override
 54     public long getItemId(int position) {
 55         // TODO Auto-generated method stub
 56         return position;
 57     }
 58 
 59     /*
 60      * (non-avadoc) <p>Title: getItemCount</p> <p>Description: </p>
 61      * 
 62      * @params @return
 63      * 
 64      * @overrided @see
 65      * android.support.v7.widget.RecyclerView.Adapter#getItemCount()
 66      */
 67     @Override
 68     public int getItemCount() {
 69         // TODO Auto-generated method stub
 70         return dataSet.size();
 71     }
 72 
 73     /*
 74      * (non-avadoc) <p>Title: onBindViewHolder</p> <p>Description: </p>
 75      * 
 76      * @params @param arg0
 77      * 
 78      * @params @param arg1
 79      * 
 80      * @overrided @see
 81      * android.support.v7.widget.RecyclerView.Adapter#onBindViewHolder
 82      * (android.support.v7.widget.RecyclerView.ViewHolder, int)
 83      */
 84     @Override
 85     public void onBindViewHolder(ViewHolder holder, final int arg1) {
 86         // TODO Auto-generated method stub
 87         holder.tv.setOnClickListener(new OnClickListener() {
 88 
 89             @Override
 90             public void onClick(View v) {
 91                 // TODO Auto-generated method stub
 92                 Toast.makeText(context, "You clickd TextView at index of "+arg1,
 93                         Toast.LENGTH_SHORT).show();
 94             }
 95         });
 96         holder.tv.setText(dataSet.get(arg1));
 97     }
 98 
 99     /*
100      * (non-avadoc) <p>Title: onCreateViewHolder</p> <p>Description: </p>
101      * 
102      * @params @param arg0
103      * 
104      * @params @param arg1
105      * 
106      * @params @return
107      * 
108      * @overrided @see
109      * android.support.v7.widget.RecyclerView.Adapter#onCreateViewHolder
110      * (android.view.ViewGroup, int)
111      */
112 
113     @Override
114     public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int arg1) {
115         // TODO Auto-generated method stub
116         Log.i(ADAPTER_TAG, "itemTV---" + ++COUNT_CACHE_VIEW);
117         View itemLayout = LayoutInflater.from(viewGroup.getContext()).inflate(
118                 R.layout.recycler_view_item_layout_tv, null);
119         return new ViewHolder(itemLayout);
120     }
121 
122     public static class ViewHolder extends RecyclerView.ViewHolder {
123         public TextView tv;
124 
125         /**
126          * <p>
127          * Title: MainActivity.java
128          * </p>
129          * <p>
130          * Description:
131          * </p>
132          * 
133          * @param @param itemView
134          */
135         public ViewHolder(View itemView) {
136             super(itemView);
137             // TODO Auto-generated constructor stub
138             tv = (TextView) itemView.findViewById(R.id.rv_item_tv);
139         }
140     }
141 }
MyRVAdapter

相关文章:

  • 2022-12-23
  • 2021-07-27
  • 2021-07-03
  • 2021-05-25
  • 2021-07-30
  • 2022-12-23
  • 2021-11-14
  • 2021-12-02
猜你喜欢
  • 2021-12-24
  • 2022-12-23
  • 2021-06-13
  • 2021-04-06
  • 2022-12-23
  • 2021-05-04
  • 2021-09-12
相关资源
相似解决方案