RecyclerView 是一个非常强大的控件,甚至它可以替代 ListView 和 GridView ,如果想使用 RecyclerView ,就需要了解它的优点、以及它的缺点,这样才可以更好地使用这一款控件。
- RecyclerView 的优点:
- 高度的解耦
- 异常的灵活性和更高的灵活性
- 通够设置它提供的不同 LayoutManager 、ItemDecoration 、ItemAnimator可以实现丰富多彩的效果
- RecyclerView 的缺点:
- 设置列表的分割线需要自定义
- 需要自己实现点击事件
下面我们需要实现的 RecyclerView 的效果如下
实现上面的图片的效果,我们需要实现的代码逻辑有:
- 添加页面的布局代码
- 创建继承于 RecyclerView.Adapter 的 Adapter
- 向自定义的 Adapter 里面添加数据
- 自定义 item 的分割线
- 自定 item 的监听事件
1.0 添加页面的布局代码
activity_main.xml 的布局代码如下:
1 | <RelativeLayout |
item_recycler.xml 的布局代码如下:
1 | <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" |
因为实现 RecyclerView 的页面布局的代码比较简单,在这里就不做详细的说明了;
2.0 创建继承于 RecyclerView.Adapter 的 Adapter
Adapter 最大的改进就是对 ViewHolder 进行封装:
1 | public class HomeAdapter extends RecyclerView.Adapter<HomeAdapter.MyViewHolder> |
对于需要继承 RecyclerView.Adapter<HomeAdapter.MyViewHolder> 这个泛型类,我的理解是这样的,因为在自定义的 Adapter 里面,需要重写 public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) 方法,以及重写 public void onBindViewHolder(final MyViewHolder holder, final int position) 着一个方法,方法一返回的 MyViewHolder 的对象实例,方法二是如何知道它自己拿到的就是方法一返回的对象实例呢?只有通过泛型类,限制了方法二拿到的对象类型,这样才可以确保方法二拿到的是方法一的对象实例;
HomeAdapter.java 的代码逻辑如下:
1 | public class HomeAdapter extends RecyclerView.Adapter<HomeAdapter.MyViewHolder> { |
3.0 向自定义的 Adapter 里面添加数据
MainActivity.java 的代码逻辑如下:
1 | public class MainActivity extends AppCompatActivity { |
4.0 设置 item 的分割线
DividerItemDecoration.java 的代码逻辑如下:
1 | public class DividerItemDecoration extends RecyclerView.ItemDecoration { |
因为部分注释我已经在代码中写了,因而我就不重复再描述一遍了…