Android L新控件RecyclerView簡介


Android L是android進化史上的里程碑,盡管還沒有正式發布4.5或者5.0,但預覽版也同樣精彩。

這篇文章只是另外一篇博客的總結性翻譯,能夠讀懂原文的,可以點開這個鏈接去閱讀精彩的原文:http://www.javacodegeeks.com/2014/07/android-recyclerview.html。

在android L的預覽版中,最新的v7支持包新添加了兩個控件:RecyclerView和CardView。這里只對RecyclerView作簡要介紹。

RecyclerView是經典的ListView的進化與升華,它比ListView更加靈活,但也因此引入了一定的復雜性。

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

同ListView一樣,RecyclerView也需要使用Adapter。Adapter的作用主要是負責一個item中視圖的布局以及信息的展示。RecyclerView中的Adapter如下:

1 public class MyRecyclerAdapter extends RecyclerView.Adapter<MyRecyclerAdapter.MyHolder> {
2     ....
3 }
View Code

其中MyHolder既是ViewHolder的實現。下面是一個item中布局:

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     android:orientation="vertical" android:layout_width="match_parent"
 3     android:layout_height="match_parent">
 4 
 5     <TextView
 6         android:layout_width="wrap_content"
 7         android:layout_height="wrap_content"
 8         android:id="@+id/txt1"/>
 9 
10     <TextView
11         android:layout_width="wrap_content"
12         android:layout_height="wrap_content"
13         android:id="@+id/txt2"/>
14 
15 </LinearLayout>
View Code

所以ViewHolder的實現如下:

 1 public static class MyHolder extends RecyclerView.ViewHolder {
 2     protected TextView txt1;
 3     protected TextView txt2;
 4 
 5     private MyHolder(View v) {
 6         super(v);
 7         this.txt1 = (TextView) v.findViewById(R.id.txt1);
 8         this.txt2 = (TextView) v.findViewById(R.id.txt2);
 9     }
10 }
View Code

你可以注意到,findViewById是在ViewHolder的構造函數而非如ListView的getView中調用的。

同時,為了我們的Adapter能夠正常的工作,以下的兩個方法也必須被實現:

onCreateViewHolder(ViewGroup viewGroup, int i)和onBindViewHolder(MyHolder myHolder, int i)。

在任何ViewHolder被實例化的時候,OnCreateViewHolder將會被觸發:

1 @Override
2 public MyHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
3     numCreated++;
4     Log.d("RV", "OncreateViewHolder ["+numCreated+"]");
5     View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.row_layout, null);
6     MyHolder mh = new MyHolder(v);
7     return mh;
8 }
View Code

可見,OnCreateViewHolder創建了一個ViewHolder的實例,之后,onBindViewHolder方法則負責將數據與ViewHolder綁定:

1 @Override
2 public void onBindViewHolder(MyHolder myHolder, int i) {
3     Log.d("RV", "OnBindViewHolder");
4     Item item = itemList.get(i);
5     myHolder.txt1.setText(item.name);
6     myHolder.txt2.setText(item.descr);
7 }
View Code

注意,在這里我們可以直接使用存儲在ViewHolder中的控件,而不必再次通過findViewById或者其它什么方法來進行查找。

有了Adapter和數據,我們就可以使用RecyclerView了:

1 RecyclerView rv = (RecyclerView) findViewById(R.id.my_recycler_view);
2 rv.setLayoutManager(new LinearLayoutManager(this));
3 MyRecyclerAdapter adapter = new MyRecyclerAdapter(createList());
4 rv.setAdapter(adapter);
View Code

如果你進行過測試,你就會通過log發現一個有趣的現象:無論有多少item要顯示,被創建的ViewHolder具體的個數為RecyclerView最多能夠顯示的item個數再加上2。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM