RecyclerView使用踩坑全过程

Long long ago,谷歌就推出了RecyclerView来替代ListView,有人说它好,功能强大,方便扩展,也有人说它极其难用,最近Coder哥的项目需要代码重构,于是就想用RecyclerView来替代ListView,在此总结一下使用过程中的一些坑点,为大家今后的使用铺平道路。

一、点击事件及分割线需自定义

这一点不需要我多说,大家自行谷歌,代码很全,不在此造轮子了。

二、item布局match_parent属性失效问题

如果大家使用的是LinearLayoutMananger,并且在Adapter中创建item view使用的是如下的方法:

view =mInflater.inflate(R.layout.divider, null);

那么就会导致item无法居中显示,因为inflater在inflate一个xml时,需要知道parent的类型,才能生成对应的LayoutParams,才可以把xml根节点的attrs(如layout_width)读进去。所以需要使用如下代码:

view =mInflater.inflate(R.layout.divider, parent, false);

那么如果你使用的是自定义view,不是在adapter中使用Inflater进行布局创建,那么上面的方法就不好用了,此时,需要对item的根布局进行一次属性重设。如下:

    @Override
    public CommonViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = new CustomView(mContext);
        //在RecyclerView中,若使用的是LinearLayoutManager,由于view的创建没有用到parent,所以View中的match_parent属性会失效,所以在此显示设置一次,其他种类的LayoutManager不会出现此问题
        view.setLayoutParams(new LinearLayout.LayoutParams(
  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
RecyclerView 是 Android 系统中的一个视图组件,它可以用来展示列表、网格等数据集合。相对于 ListView 和 GridView,RecyclerView 更加灵活,支持自定义布局和动画等功能。使用 RecyclerView,我们需要定义一个 Adapter 来管理数据,以及一个 LayoutManager 来控制布局方式。 以下是 RecyclerView使用步骤: 1. 在布局文件中定义 RecyclerView 组件。 2. 定义 RecyclerViewAdapter,继承自 RecyclerView.Adapter,并实现三个方法:onCreateViewHolder、onBindViewHolder 和 getItemCount。 3. 定义 RecyclerView 的 LayoutManager,可以使用系统提供的 LinearLayoutManager、GridLayoutManager 或者自定义实现。 4. 在 Activity 或者 Fragment 中获取 RecyclerView 对象,并设置 Adapter 和 LayoutManager。 5. 可选的,可以设置 RecyclerView 的 ItemDecoration 和 ItemAnimator,用于美化界面和实现动画效果。 下面是一份简单的示例代码: 1. 在布局文件中定义 RecyclerView 组件: ``` <androidx.recyclerview.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 2. 定义 RecyclerViewAdapter: ``` public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { private List<String> mData; public MyAdapter(List<String> data) { mData = data; } @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { holder.textView.setText(mData.get(position)); } @Override public int getItemCount() { return mData.size(); } static class ViewHolder extends RecyclerView.ViewHolder { TextView textView; ViewHolder(@NonNull View itemView) { super(itemView); textView = itemView.findViewById(R.id.text_view); } } } ``` 3. 定义 RecyclerView 的 LayoutManager: ``` RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this); ``` 4. 在 Activity 或者 Fragment 中获取 RecyclerView 对象,并设置 Adapter 和 LayoutManager: ``` RecyclerView recyclerView = findViewById(R.id.recycler_view); recyclerView.setLayoutManager(layoutManager); recyclerView.setAdapter(new MyAdapter(data)); ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值