• 热门专题

Android L新控件RecyclerView简介

作者:LittlePanpc  发布日期:2014-07-22 20:53:44
Tag标签:控件  简介  
  • 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 }

    其中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>

    所以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 }

    你可以注意到,findViewById是在ViewHolder的构造函数而非如ListView的getView中调用的。

    同时,为了我们的Adapter能够正常的工作,以下的两个方法也必须被实现:

    onCreateViewHolder(ViewGroup viewGroup, word">int i)和onBindViewHolder(MyHolder myHolder, word">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 }

    可见,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 }

    注意,在这里我们可以直接使用存储在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);

    如果你进行过测试,你就会通过log发现一个有趣的现象:无论有多少item要显示,被创建的ViewHolder大约只有可见item个数的1/3左右。

About IT165 - 广告服务 - 隐私声明 - 版权申明 - 免责条款 - 网站地图 - 网友投稿 - 联系方式
本站内容来自于互联网,仅供用于网络技术学习,学习中请遵循相关法律法规