本文共 3960 字,大约阅读时间需要 13 分钟。
RecyclerView这个V7包下的控件相信大家都非常熟悉了,面试的时候别人问你你要是说很多条目数据的展示还用ListView这就尴尬了,下面我们就来复习下RecyclerView的使用。
RecyclerView的命名就能知道他只负责View,其他的东西不归它管,Recycler英文的意思是再循环器
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));