RecyclerView的前身就是ListView,为什么有了ListView还需要RecyclerView呢?因为ListView天生就有很大的缺陷。
ListView的缺陷
1.ListView的扩展性不好,只能实现纵向滚动,不支持横向滚动。
2.ListView的点击事件setOnItemClickListener()不能做到精确定位(例如ListView的item中还有一个按钮)。
RecyclerView的基本用法
- 需要添加support库
- 在布局中使用RecyclerView
ps:因为RecyclerView不是内置在系统SDK当中,所以需要写出完整的包路径 - 代码中找到RecyclerView,设置布局管理器,适配器、
布局管理器
RecyclerView提供了3种布局管理器1.LinearLayoutManager;2.GridLayoutManager;3.StaggeredGridLayoutManager。
1.LinearLayoutManager默认是纵向排列的,显示的item是从上到下的。如果想横向排列,及从左到右显示item需要设置方向。
LinearLayoutManager manager = new LinearLayoutManager(this);
manager.setOrientation(LinearLayoutManager.HORIZONTAL);
2.GridLayoutManager是网格布局,可以自己设置分为几列。
3.StaggeredGridLayoutManager是瀑布流布局,可以轻松的实现瀑布流的效果。我们也可以设置瀑布流的排列方式(横向,纵向)和行(列)数。
适配器
适配器需要基础RecyclerView.Adapter;必须要实现3个方法。
1.onCreateViewHolder();2.onBindViewHolder();getItemCount()。
1.onCreateViewHolder()用于创建ViewHolder实例(一般都是内部类,viewHolder要继承RecyclerView.ViewHolder),然后将这个ViewHolder实例返回。
2.onBindViewHolder()对RecyclerView的子项数据进行赋值,会在每个子项被滚动到屏幕内的时候执行。
3.getItemCount()告诉RecyclerView有多少子项,直接返回数据源的长度。
- 点击事件
RecyclerView并没有和ListView一样的setOnItemTouchListener(),所有的点击事件都要具体的View去注册(可通过ViewHolder获取到相应的View
然后setOnClickListener()),这样就解决了开头提到ListView的点击问题。
可以通过下面的代码获取到postion,然后通过postion做相关操作。
int position = holder.getAdapterPosition();
补充
ListView的布局排列是有自身去管理的,而RecyclerView将这个工作交给了LayoutManager,LayoutManager中制定了一套可以扩展的布局排列接口,子类只需要按照接口的规范来实现,就能定制出各种不同排列方式的布局。
参考文章:郭霖 《第一行代码》
网友评论