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     <TextView11         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,inti)和onBindViewHolder(MyHolder myHolder,inti)。

在任何ViewHolder被实例化的时候,OnCreateViewHolder将会被触发:

1 @Override2 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 @Override2 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。

更多相关文章

  1. [置顶] Mc小冰总结的Android开发工程师面试题以及答案,android程
  2. Android自定义属性时TypedArray的使用方法
  3. Android(安卓)Sqlite 数据库—基础篇
  4. 使用Kotlin开发Android基础介绍
  5. android中的http框架,使其更加简单易用
  6. Android(安卓)Layout文件的属性说明
  7. android使用socket使底层和framework通信
  8. Android使用Fragment打造万能页面切换框架
  9. Android(安卓)svg图片使用

随机推荐

  1. Android(安卓)Animation Tween动画效果的
  2. Android(安卓)Service 弹出系统全局Dialo
  3. Android:Textview 通过代码设置 Drawable
  4. 使用RecyclerView加载不出数据的原因可能
  5. webservice android 设置head头发送 获取
  6. Android(安卓)Service用法总结和生命周期
  7. Android(安卓)单元测试
  8. android emulator连接internet
  9. Android(安卓)自动解锁 KeyguardManager(
  10. android 各种高级素材使用