Android RecyclerView简单实现及Adapter示例

RecyclerView也是用很久了,但一段时间不用之后还是会要各种查资料找用法,所以,还是有必要记录一下它的基本用法。

RecyclerView,是官方在Android5.0推出的新组件,它集成在support-v7包中。RecyclerView并不是取代ListView的,各有侧重,不过RecyclerView的出现,使大量数据的展示更为方便和多样化。比如横向滚动,比如瀑布流布局。OK,介绍就到这里 ,下面进入它的简单使用:

因为RecyclerView是集成在support-v7包里的,所以我们第一步就是导入:

implementation 'com.android.support:recyclerview-v7:28.0.0'

我这里使用的版本比较高,各位可以根据自己的实际情况添加对应的v7包。

然后你就可以在布局文件中添加RecyclerView控件了:

<android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

Activity中初始化并生成简单的数据,这里需要主意一点的是,RecyclerView和ListView的用法还是有些区别的,RecyclerView需要设置布局管理器以控制Item的布局方式,比如横向竖向以及瀑布流方式,这里就不具体展开,大家有兴趣可以自行去研究,我这里就以普遍的LinearLayoutManager来做示范。

private RecyclerView recyclerView;
private LinearLayoutManager linearLayoutManager;
//测试数据集合
private List<Map<String, Object>> datas = new ArrayList<>();


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_notification_test);
        
    //准备测试数据
    for (int i=0;i<10;i++) {
      Map<String, Object> map = new HashMap<>();
      map.put("title", "万历十五年" + i);
      map.put("content", "在《万历十五年》一书中,黄仁宇用近乎平淡的笔触分析一个皇朝从兴盛走向衰颓的原因,而这些平淡的叙述自有力量,他淡然勾勒出的人生困境,即便是对历史学不感兴趣的读者,也心有戚戚焉。");
      datas.add(map);
    }

    recyclerView = findViewById(R.id.recyclerview);
    linearLayoutManager = new LinearLayoutManager(this);
    recyclerView.setLayoutManager(linearLayoutManager);
    recyclerView.setAdapter(new TestAdapter(this, datas));
}

和ListView的使用基本差不多,同样的设置Adapter,下面是Adapter的代码:

public class TestAdapter extends RecyclerView.Adapter<TestAdapter.ViewHolder> {
        public class ViewHolder extends RecyclerView.ViewHolder {
            public TextView title;
            public TextView content;
            public ViewHolder(@NonNull View itemView) {
                super(itemView);
                title = itemView.findViewById(R.id.tv_title);
                content = itemView.findViewById(R.id.tv_content);
            }
        }
        private List<Map<String, Object>> mDatas;
        private final Context context;
        public TestAdapter(Context context, List<Map<String, Object>> mDatas) {
            this.context = context;
            this.mDatas = mDatas;
        }

        @NonNull
        @Override
        public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
            View view = LayoutInflater.from(context).inflate(R.layout.recyclerview_item,null);
            return new ViewHolder(view);
        }
        @Override
        public void onBindViewHolder(@NonNull ViewHolder viewHolder, final int i) {
            viewHolder.title.setText(mDatas.get(i).get("title").toString());
            viewHolder.content.setText(mDatas.get(i).get("content").toString());
            viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(context, "点击"+mDatas.get(i).get("title").toString(), Toast.LENGTH_SHORT).show();
                }
            });
        }
        @Override
        public int getItemCount() {
            return mDatas.size();
        }
    }

可能大家都会注意到,这里和ListView的Adapter还是有点区别的,具体说一下吧,首先,RecyclerView的Adapter继承的是RecyclerView.Adapter,并且泛型添加ViewHolder,此处ViewHolder直接实现在Adapter里。然后在onCreateViewHolder里通过

LayoutInflater.from(context).inflate(R.layout.recyclerview_item,null);

得到具体项的布局view,最后返回的是这个view的ViewHolder。在onBindViewHolder里,我们可以设置各项组件所显示的内容并且设置点击事件,我这里设置的是itemView的点击事件,就是点击这一项都会有响应,你也可以直接设置某一个控件的点击事件,具体方法是一样的。

好了,相对来说比较简单,因为和ListView的用法虽然有点出入,但还是大同小异的,只是要注意那些不一样的地方。下面上效果图:

暂时只关注功能实现哈,界面什么的,各位都是大牛。不过有细心的读者可能会发现问题,为什么项与项之间没有任何分隔,是的,RecyclerView默认没有分隔线,并不是说没有这个功能 ,相反,RecyclerView还把这个功能实现的非常好,让你可以自定义分隔线,不过这里就不展开讲,我们通过一个最简单的方式添加一根默认的分隔线:

recyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));

ok,就添加这一句话 ,我们就实现了分隔线的功能,看效果:

OK,打完收工。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值