關於RecyclerView中Viewholder和View的緩存機制的探究

這個題目放在草稿箱裏面許久了,一直沒有動力提筆。趁如今公司人尚未來齊,工做量還不是很大,就擠出來時間來把它完善了。html

 

咱們知道,RecyclerView是經典的ListView的進化與昇華,它比ListView更加靈活,但也所以引入了必定的複雜性。最新的v7支持包新添加了RecyclerView。java

咱們知道,ListView經過使用ViewHolder來提高性能。ViewHolder經過保存item中使用到的控件的引用來減小findViewById的調用,以此使ListView滑動得更加順暢。但這種模式即便不使用也無妨。android

對於還不是很熟悉RecyclerView的程序員,能夠先從這兩篇文章裏面瞭解一下它的基本用法:git

Android L新控件RecyclerView簡介程序員

RecyclerView和CardView簡介github

這裏對RecyclerView的基本使用方式,就再也不贅述,只討論RecyclerView中的ViewHolder的緩存機制。其實它的緩存機制大體原理跟ListView是類似的,只是在具體的實現細節上面有些差別。對於這些RecyclerView的緩存機制,Android L新控件RecyclerView簡介這篇文章的結尾進行了總結性的歸納,這裏討論的內容要遠比這篇簡介的內容要複雜和多。緩存

首先,我定義了三個不一樣的Adapter,裏面分別對應了三種狀況:item類型只有一種;item類型有兩種;item類型有三種。裏面均重寫了onCreateViewHolder方法,用於記錄生成的ViewHolder或者View的數目。內容能夠從Log裏面查詢獲得。三個Adapter的細節分別是:app

  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
  1 /**   
  2  * @Title: MyRVAdapter2.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:55:31 
  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.content.Intent;
 15 import android.support.v7.widget.RecyclerView;
 16 import android.util.Log;
 17 import android.view.LayoutInflater;
 18 import android.view.View;
 19 import android.view.ViewGroup;
 20 import android.view.View.OnClickListener;
 21 import android.widget.ImageView;
 22 import android.widget.TextView;
 23 import android.widget.Toast;
 24 
 25 import com.example.recyclerviewtest.GridViewHorizontalTest;
 26 import com.example.recyclerviewtest.GridViewVerticalTest;
 27 import com.example.recyclerviewtest.R;
 28 
 29 /**
 30  * @ClassName: MyRVAdapter2
 31  * @Description: TODO
 32  * @author SilentKnight || happychinapc@gmail.com
 33  * @date 2015年1月22日 下午4:55:31
 34  * 
 35  */
 36 public class MyRVAdapter2 extends RecyclerView.Adapter<MyRVAdapter2.ViewHolder> {
 37     private static int COUNT_CACHE_VIEW_1 = 0;
 38     private static int COUNT_CACHE_VIEW_2 = 0;
 39     private static final String ADAPTER_TAG = MyRVAdapter2.class
 40             .getSimpleName();
 41     private static final int TYPE_TV = 0x000;
 42     private static final int TYPE_IV = 0x0001;
 43     private List<String> dataSet;
 44     private Context context;
 45 
 46     public MyRVAdapter2(Context context, List<String> dataSet) {
 47         this.context = context;
 48         this.dataSet = dataSet;
 49     }
 50 
 51     /*
 52      * (non-avadoc) <p>Title: getItemId</p> <p>Description: </p>
 53      * 
 54      * @params @param position
 55      * 
 56      * @params @return
 57      * 
 58      * @overrided @see
 59      * android.support.v7.widget.RecyclerView.Adapter#getItemId(int)
 60      */
 61     @Override
 62     public long getItemId(int position) {
 63         // TODO Auto-generated method stub
 64         return position;
 65     }
 66 
 67     /*
 68      * (non-avadoc) <p>Title: getItemViewType</p> <p>Description: </p>
 69      * 
 70      * @params @param position
 71      * 
 72      * @params @return
 73      * 
 74      * @overrided @see
 75      * android.support.v7.widget.RecyclerView.Adapter#getItemViewType(int)
 76      */
 77     @Override
 78     public int getItemViewType(int position) {
 79         // TODO Auto-generated method stub
 80         if (position % 2 == 0) {
 81             return TYPE_TV;
 82         } else {
 83             return TYPE_IV;
 84         }
 85     }
 86 
 87     /*
 88      * (non-avadoc) <p>Title: getItemCount</p> <p>Description: </p>
 89      * 
 90      * @params @return
 91      * 
 92      * @overrided @see
 93      * android.support.v7.widget.RecyclerView.Adapter#getItemCount()
 94      */
 95     @Override
 96     public int getItemCount() {
 97         // TODO Auto-generated method stub
 98         return dataSet.size();
 99     }
100 
101     /*
102      * (non-avadoc) <p>Title: onBindViewHolder</p> <p>Description: </p>
103      * 
104      * @params @param arg0
105      * 
106      * @params @param arg1
107      * 
108      * @overrided @see
109      * android.support.v7.widget.RecyclerView.Adapter#onBindViewHolder
110      * (android.support.v7.widget.RecyclerView.ViewHolder, int)
111      */
112     @Override
113     public void onBindViewHolder(ViewHolder holder, int arg1) {
114         // TODO Auto-generated method stub
115         if (getItemViewType(arg1) == TYPE_TV) {
116             holder.tv.setOnClickListener(new OnClickListener() {
117 
118                 @Override
119                 public void onClick(View v) {
120                     // TODO Auto-generated method stub
121                     context.startActivity(new Intent(context,
122                             GridViewHorizontalTest.class));
123                 }
124             });
125             holder.tv.setText(dataSet.get(arg1));
126         } else {
127             holder.iv.setOnClickListener(new OnClickListener() {
128 
129                 @Override
130                 public void onClick(View v) {
131                     // TODO Auto-generated method stub
132                     context.startActivity(new Intent(context,
133                             GridViewVerticalTest.class));
134                 }
135             });
136         }
137     }
138 
139     /*
140      * (non-avadoc) <p>Title: onCreateViewHolder</p> <p>Description: </p>
141      * 
142      * @params @param arg0
143      * 
144      * @params @param arg1
145      * 
146      * @params @return
147      * 
148      * @overrided @see
149      * android.support.v7.widget.RecyclerView.Adapter#onCreateViewHolder
150      * (android.view.ViewGroup, int)
151      */
152 
153     @Override
154     public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int arg1) {
155         // TODO Auto-generated method stub
156         if (getItemViewType(arg1) == TYPE_TV) {
157             Log.i(ADAPTER_TAG, "itemTV---" + ++COUNT_CACHE_VIEW_1);
158             View itemLayout = LayoutInflater.from(viewGroup.getContext())
159                     .inflate(R.layout.recycler_view_item_layout_tv, null);
160             return new ViewHolder(itemLayout, TYPE_TV);
161         } else {
162             Log.i(ADAPTER_TAG, "itemIV---" + ++COUNT_CACHE_VIEW_2);
163             View itemLayout = LayoutInflater.from(viewGroup.getContext())
164                     .inflate(R.layout.recycler_view_item_layout_iv, null);
165             return new ViewHolder(itemLayout, TYPE_IV);
166         }
167     }
168 
169     public static class ViewHolder extends RecyclerView.ViewHolder {
170         public TextView tv;
171         public ImageView iv;
172 
173         /**
174          * <p>
175          * Title: MainActivity.java
176          * </p>
177          * <p>
178          * Description:
179          * </p>
180          * 
181          * @param @param itemView
182          */
183         public ViewHolder(View itemView, int itemType) {
184             super(itemView);
185             // TODO Auto-generated constructor stub
186             if (itemType == TYPE_TV) {
187                 tv = (TextView) itemView.findViewById(R.id.rv_item_tv);
188             } else {
189                 iv = (ImageView) itemView.findViewById(R.id.rv_item_iv);
190             }
191         }
192     }
193 }
MyRVAdapter2
  1 /**   
  2  * @Title: MyRVAdapter3.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:56:33 
  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.ImageView;
 21 import android.widget.TextView;
 22 import android.widget.Toast;
 23 
 24 import com.example.recyclerviewtest.R;
 25 
 26 /**
 27  * @ClassName: MyRVAdapter3
 28  * @Description: TODO
 29  * @author SilentKnight || happychinapc@gmail.com
 30  * @date 2015年1月22日 下午4:56:33
 31  * 
 32  */
 33 public class MyRVAdapter3 extends RecyclerView.Adapter<MyRVAdapter3.ViewHolder> {
 34     private static int COUNT_CACHE_VIEW_1 = 0;
 35     private static int COUNT_CACHE_VIEW_2 = 0;
 36     private static int COUNT_CACHE_VIEW_3 = 0;
 37     private static final String ADAPTER_TAG = MyRVAdapter3.class
 38             .getSimpleName();
 39     private static final int TYPE_TV = 0x000;
 40     private static final int TYPE_IV = 0x0001;
 41     private static final int TYPE_TV_2 = 0x0002;
 42     private List<String> dataSet;
 43     private Context context;
 44 
 45     public MyRVAdapter3(Context context, List<String> dataSet) {
 46         this.context = context;
 47         this.dataSet = dataSet;
 48     }
 49 
 50     /*
 51      * (non-avadoc) <p>Title: getItemId</p> <p>Description: </p>
 52      * 
 53      * @params @param position
 54      * 
 55      * @params @return
 56      * 
 57      * @overrided @see
 58      * android.support.v7.widget.RecyclerView.Adapter#getItemId(int)
 59      */
 60     @Override
 61     public long getItemId(int position) {
 62         // TODO Auto-generated method stub
 63         return position;
 64     }
 65 
 66     /*
 67      * (non-avadoc) <p>Title: getItemViewType</p> <p>Description: </p>
 68      * 
 69      * @params @param position
 70      * 
 71      * @params @return
 72      * 
 73      * @overrided @see
 74      * android.support.v7.widget.RecyclerView.Adapter#getItemViewType(int)
 75      */
 76     @Override
 77     public int getItemViewType(int position) {
 78         // TODO Auto-generated method stub
 79         if (position % 3 == 0) {
 80             return TYPE_TV;
 81         } else if (position % 3 == 1) {
 82             return TYPE_IV;
 83         } else {
 84             return TYPE_TV_2;
 85         }
 86     }
 87 
 88     /*
 89      * (non-avadoc) <p>Title: getItemCount</p> <p>Description: </p>
 90      * 
 91      * @params @return
 92      * 
 93      * @overrided @see
 94      * android.support.v7.widget.RecyclerView.Adapter#getItemCount()
 95      */
 96     @Override
 97     public int getItemCount() {
 98         // TODO Auto-generated method stub
 99         return dataSet.size();
100     }
101 
102     /*
103      * (non-avadoc) <p>Title: onBindViewHolder</p> <p>Description: </p>
104      * 
105      * @params @param arg0
106      * 
107      * @params @param arg1
108      * 
109      * @overrided @see
110      * android.support.v7.widget.RecyclerView.Adapter#onBindViewHolder
111      * (android.support.v7.widget.RecyclerView.ViewHolder, int)
112      */
113     @Override
114     public void onBindViewHolder(ViewHolder holder, int arg1) {
115         // TODO Auto-generated method stub
116         if (getItemViewType(arg1) == TYPE_TV) {
117             holder.tv.setOnClickListener(new OnClickListener() {
118 
119                 @Override
120                 public void onClick(View v) {
121                     // TODO Auto-generated method stub
122                     Toast.makeText(context, "You clickd TextView",
123                             Toast.LENGTH_SHORT).show();
124                 }
125             });
126             holder.tv.setText(dataSet.get(arg1));
127         } else if (getItemViewType(arg1) == TYPE_IV) {
128             holder.iv.setOnClickListener(new OnClickListener() {
129 
130                 @Override
131                 public void onClick(View v) {
132                     // TODO Auto-generated method stub
133 
134                     Toast.makeText(context, "You clickd ImageView",
135                             Toast.LENGTH_SHORT).show();
136                 }
137             });
138         } else {
139 
140         }
141     }
142 
143     /*
144      * (non-avadoc) <p>Title: onCreateViewHolder</p> <p>Description: </p>
145      * 
146      * @params @param arg0
147      * 
148      * @params @param arg1
149      * 
150      * @params @return
151      * 
152      * @overrided @see
153      * android.support.v7.widget.RecyclerView.Adapter#onCreateViewHolder
154      * (android.view.ViewGroup, int)
155      */
156 
157     @Override
158     public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int arg1) {
159         // TODO Auto-generated method stub
160         if (getItemViewType(arg1) == TYPE_TV) {
161             Log.i(ADAPTER_TAG, "itemTV---" + ++COUNT_CACHE_VIEW_1);
162             View itemLayout = LayoutInflater.from(viewGroup.getContext())
163                     .inflate(R.layout.recycler_view_item_layout_tv, null);
164             return new ViewHolder(itemLayout, TYPE_TV);
165         } else if (getItemViewType(arg1) == TYPE_IV) {
166             Log.i(ADAPTER_TAG, "itemIV---" + ++COUNT_CACHE_VIEW_2);
167             View itemLayout = LayoutInflater.from(viewGroup.getContext())
168                     .inflate(R.layout.recycler_view_item_layout_iv, null);
169             return new ViewHolder(itemLayout, TYPE_IV);
170         } else {
171             Log.i(ADAPTER_TAG, "itemTV2---" + ++COUNT_CACHE_VIEW_3);
172             View itemLayout = LayoutInflater.from(viewGroup.getContext())
173                     .inflate(R.layout.recycler_view_item_layout_tv_2, null);
174             return new ViewHolder(itemLayout, TYPE_TV_2);
175         }
176     }
177 
178     public static class ViewHolder extends RecyclerView.ViewHolder {
179         public TextView tv;
180         public TextView tv2;
181         public ImageView iv;
182 
183         /**
184          * <p>
185          * Title: MainActivity.java
186          * </p>
187          * <p>
188          * Description:
189          * </p>
190          * 
191          * @param @param itemView
192          */
193         public ViewHolder(View itemView, int itemType) {
194             super(itemView);
195             // TODO Auto-generated constructor stub
196             if (itemType == TYPE_TV) {
197                 tv = (TextView) itemView.findViewById(R.id.rv_item_tv);
198             } else if (itemType == TYPE_IV) {
199                 iv = (ImageView) itemView.findViewById(R.id.rv_item_iv);
200             } else {
201                 tv2 = (TextView) itemView.findViewById(R.id.rv_item_tv);
202             }
203         }
204     }
205 }
MyRVAdapter3

同時,這個測試工程裏面只有一個Activity,它的詳情以下:ide

 1 package com.example.recyclerviewtest;
 2 
 3 import java.util.List;
 4 
 5 import com.example.recyclerviewtest.adapter.MyRVAdapter;
 6 import com.example.recyclerviewtest.adapter.MyRVAdapter2;
 7 import com.example.recyclerviewtest.adapter.MyRVAdapter3;
 8 import com.example.recyclerviewtest.util.Utils;
 9 
10 import android.support.v7.app.ActionBarActivity;
11 import android.support.v7.widget.LinearLayoutManager;
12 import android.support.v7.widget.RecyclerView;
13 import android.os.Bundle;
14 import android.widget.LinearLayout;
15 
16 public class MainActivity extends ActionBarActivity {
17     private static final String TAG = MainActivity.class.getSimpleName();
18 
19     private RecyclerView rvHorizontal;
20     private RecyclerView rvVertical;
21 
22     @Override
23     protected void onCreate(Bundle savedInstanceState) {
24         super.onCreate(savedInstanceState);
25         setContentView(R.layout.activity_main);
26         rvHorizontal = (RecyclerView) findViewById(R.id.recyclier_view_horizontal);
27         rvVertical = (RecyclerView) findViewById(R.id.recyclier_view_vertical);
28         List<String> dataSet = Utils.generateDataSet();
29         LinearLayoutManager layoutManager = new LinearLayoutManager(this,
30                 LinearLayout.HORIZONTAL, false);
31         rvHorizontal.setLayoutManager(layoutManager);
32         layoutManager = new LinearLayoutManager(this, LinearLayout.VERTICAL,
33                 false);
34         rvVertical.setLayoutManager(layoutManager);
35         MyRVAdapter adapter = new MyRVAdapter(this, dataSet);
36         MyRVAdapter2 adapter2 = new MyRVAdapter2(this, dataSet);
37         MyRVAdapter3 adapter3 = new MyRVAdapter3(this, dataSet);
38         rvHorizontal.setAdapter(adapter2);
39         rvVertical.setAdapter(adapter);
40     }
41 
42 }
MainActivity

對於你想測試的三種狀況,你能夠通達代碼rvHorizontal.setAdapter(adapter2)和rvVertical.setAdapter(adapter)來進行測試。在測試的過程當中,能夠經過改變RecyclerView的寬度來測試顯示ViewHolder的數目。好比,item的寬度爲60dp,你能夠分別測試下RecyclerView的寬度分別爲60dp、120dp和180dp狀況下log的打印狀況。其中,activity的佈局文件以下:佈局

 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:paddingBottom="@dimen/activity_vertical_margin"
 6     android:paddingLeft="@dimen/activity_horizontal_margin"
 7     android:paddingRight="@dimen/activity_horizontal_margin"
 8     android:paddingTop="@dimen/activity_vertical_margin"
 9     tools:context="com.example.recyclerviewtest.MainActivity" >
10 
11     <android.support.v7.widget.RecyclerView
12         android:id="@+id/recyclier_view_horizontal"
13         android:layout_width="240dp"
14         android:layout_height="70dp"
15         android:layout_alignParentTop="true"
16         android:layout_centerHorizontal="true"
17         android:scrollbars="horizontal" >
18     </android.support.v7.widget.RecyclerView>
19 
20     <android.support.v7.widget.RecyclerView
21         android:id="@+id/recyclier_view_vertical"
22         android:layout_width="match_parent"
23         android:layout_height="360dp"
24         android:layout_below="@id/recyclier_view_horizontal"
25         android:layout_centerHorizontal="true"
26         android:scrollbars="vertical" >
27     </android.support.v7.widget.RecyclerView>
28 
29 </RelativeLayout>
activity_main.xml

其中一個item的佈局以下:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:gravity="center"
 6     android:orientation="vertical" >
 7 
 8     <TextView
 9         android:id="@+id/rv_item_tv"
10         android:layout_width="60dp"
11         android:layout_height="20dp"
12         android:layout_gravity="center"
13         android:background="@drawable/item_selector"
14         android:clickable="true"
15         android:focusable="true"
16         android:focusableInTouchMode="true"
17         android:gravity="center" >
18     </TextView>
19 
20 </LinearLayout>
recycler_view_item_layout_tv.xml

總之,測試的結論是這樣的:在只有一種item的狀況下,緩存的ViewHolder的數目爲RecyclerView在滑動過程當中所能在一屏內容納的最大item個數+2。好比,在一個屏幕中只有item A能夠顯示,在滑動的過程最多能夠出現6個item(這個最可能是指全部item的個數,包括顯示徹底和顯示不徹底的總數),那麼ViewHolder的緩存個數將會是8;而有至少兩種item顯示的狀況下,每種item的ViewHolder的緩存個數爲單種item在一屏內最大顯示個數+1;好比,有3種item A,B,C,在滑動的過程,item A最多的狀況下一屏顯示了2個,那個item A對應的ViewHolder的緩存個數就是3個。

工程源文件能夠從下面的連接打開下載。

點擊下載源碼

相關文章
相關標籤/搜索