博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
RecyclerView的基础使用与拓展
阅读量:4109 次
发布时间:2019-05-25

本文共 3960 字,大约阅读时间需要 13 分钟。

RecyclerView的基本使用

RecyclerView这个V7包下的控件相信大家都非常熟悉了,面试的时候别人问你你要是说很多条目数据的展示还用ListView这就尴尬了,下面我们就来复习下RecyclerView的使用。

RecyclerView的命名就能知道他只负责View,其他的东西不归它管,Recycler英文的意思是再循环器

RecyclerView的使用步骤说起来也比较简单:

  1. 给RecyclerView设置布局管理器
  2. 给RecyclerView设置适配器

额外的也提供了许多ListView不具备的功能

  • 给每个条目设置下划线
  • 给每个条目加动画

一、基本使用

1.给RecyclerView设置布局管理器

/**A LayoutManager must be provided for RecyclerView to function.*/// 从源码注释中得知 RecyclerView必须设置布局管理器才能工作//mRecyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));

2.接下来就是设置适配器,然后加载数据 通知适配器更新

MyAdapter adapter = new MyAdapter(this, mDataList);mRecyclerView.setAdapter(adapter);//设置适配器initData();adapter.setData(mDataList);        adapter.notifyDataSetChanged();

二、适配器的基本使用

   首先继承RecyclerView.Adapter,假如所有的条目都一样则只需要复写三个方法onCreateViewHolder( )、onBindViewHolder()、getItemCount(),这三个方法的作用分别是创建返回ViewHolder、给ViewHolder绑定数据、返回条目的数量。

  如果条目显示的布局不一样,则还需要复写getItemViewType,这里返回的viewType将在onCreateViewHolder中通过不同的ViewType返回不同的ViewHolder,在onBindViewHolder通过不同的ViewHolder来区分绑定不同的数据,instance of <判断是否是某个类的实例>

效果展示如下:

        这里写图片描述

class MyAdapter extends RecyclerView.Adapter
{
private List
mPersonList; private Context mContext; private int TYPE_SMALL = 100; private int TYPE_LAGE = 110; public MyAdapter(Context context, List
data) { this.mPersonList = data; this.mContext = context; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { // 根据不同的ViewType 创建不同的 ViewHolder if (viewType == TYPE_SMALL) { View view1 = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_holder1, parent, false); return new MyViewHolder1(view1); } else if (viewType == TYPE_LAGE) { return new MyViewHolder2(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_holder2, parent, false)); } return null; } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { Person person = mPersonList.get(position); // 通过不同的ViewHolder来进行不同数据的绑定 if (holder instanceof MyViewHolder1) { ((MyViewHolder1) holder).ageTv.setText(person.getAge() + "岁"); ((MyViewHolder1) holder).nameTv.setText("姓名:" + person.getName()); } if (holder instanceof MyViewHolder2) { ((MyViewHolder2) holder).ageTv.setText(person.getAge() + "岁"); ((MyViewHolder2) holder).nameTv.setText("姓名:" + person.getName()); } } @Override public int getItemCount() { // 返回总条目数量 return mPersonList.size(); } @Override public int getItemViewType(int position) { // 返回不同的ViewType return mPersonList.get(position).getType() == 1 ? TYPE_LAGE : TYPE_SMALL; } public void setData(List
data) { mPersonList.addAll(data); } class MyViewHolder1 extends RecyclerView.ViewHolder {
TextView nameTv; TextView ageTv; public MyViewHolder1(View itemView) { super(itemView); nameTv = itemView.findViewById(R.id.name); ageTv = itemView.findViewById(R.id.age); } } class MyViewHolder2 extends RecyclerView.ViewHolder {
TextView nameTv; TextView ageTv; public MyViewHolder2(View itemView) { super(itemView); nameTv = itemView.findViewById(R.id.name); ageTv = itemView.findViewById(R.id.age); } } }

以上是最基本的使用,假设这么一种情况,你的每个条目下需要一条分割线来进行美化,你可以在item项的布局文件中加上一条,也可以通过RecyclerView提供的方法来设置。

// 给每个条目之间加上分割线mRecyclerView.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.HORIZONTAL));
你可能感兴趣的文章
python __future__
查看>>
MySQL Tricks1
查看>>
python 变量作用域问题(经典坑)
查看>>
pytorch
查看>>
pytorch(二)
查看>>
pytorch(三)
查看>>
pytorch(四)
查看>>
pytorch(5)
查看>>
pytorch(6)
查看>>
opencv 指定版本下载
查看>>
ubuntu相关
查看>>
C++ 调用json
查看>>
nano中设置脚本开机自启动
查看>>
动态库调动态库
查看>>
Kubernetes集群搭建之CNI-Flanneld部署篇
查看>>
k8s web终端连接工具
查看>>
手绘VS码绘(一):静态图绘制(码绘使用P5.js)
查看>>
手绘VS码绘(二):动态图绘制(码绘使用Processing)
查看>>
基于P5.js的“绘画系统”
查看>>
《达芬奇的人生密码》观后感
查看>>