这个题目放在草稿箱里面许久了,一直没有动力提笔。趁现在公司人还没有来齐,工作量还不是很大,就挤出来时间来把它完善了。
我们知道,RecyclerView是经典的ListView的进化与升华,它比ListView更加灵活,但也因此引入了一定的复杂性。最新的v7支持包新添加了RecyclerView。
我们知道,ListView通过使用ViewHolder来提升性能。ViewHolder通过保存item中使用到的控件的引用来减少findViewById的调用,以此使ListView滑动得更加顺畅。但这种模式即使不使用也无妨。
对于还不是很熟悉RecyclerView的程序员,可以先从这两篇文章里面了解一下它的基本用法:
这里对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 }