1. RecyclerView介绍
从Android 5.0开始,谷歌公司推出了一个用于大量数据展示的新控件RecylerView,可以用来代替传统的ListView,更加强大和灵活。它是一个用于显示庞大数据集的容器,可通过保持有限数量的视图进行非常有效的滚动操作。 如果您有数据集合,其中的元素将因用户操作或网络事件而在运行时发生改变,请使用 RecyclerView 。
在ListView中 改变列表某一个item数据,然后刷新列表,会回到最顶部,而RecyclerView可以保持原来滑动的位置不变。
要实现一个RecyclerView,会接触到它的几个小伙伴,其中1、2是必须的。剩下的3、4、5三项,可以让RecyclerView更好看、效果更好。
- 想要控制其Item们的排列方式,使用布局管理器
LayoutManager
- 如果要创建一个适配器,请使用
RecyclerView.Adapter
- 想要控制Item间的间隔,请使用
RecyclerView.ItemDecoration
- 想要控制Item增删的动画,请使用
RecyclerView.ItemAnimator
- CardView扩展
FrameLayout
类并能够显示卡片内信息,这些信息在整个平台中拥有一致的呈现方式。CardView小部件可拥有阴影和圆角。
上述RecyclerView的功能对应的使用代码是:
mRecyclerView = findView(R.id.id_recyclerview);
//设置布局管理器
mRecyclerView.setLayoutManager(layout);
//设置adapter
mRecyclerView.setAdapter(adapter)
//设置Item增加、移除动画
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
//添加分割线
mRecyclerView.addItemDecoration(new DividerItemDecoration(
getActivity(), DividerItemDecoration.HORIZONTAL_LIST));
如果要使用RecyclerView小部件,必须指定一个Adapter和一个LayoutManager。
1.1 RecyclerView使用流程
RecyclerView定义在support库当中,想要使用该控件,需要在项目的build.gradle中添加相应的依赖库。在app/build.gradle文件,在dependencies闭包中添加:
implementation 'com.android.support:recyclerview-v7:28.0.0'
添加完之后点击Sync Now进行同步(版本根据实际情况调整)
在使用RecyclerView之前,先简单介绍一下其适配器
RecyclerView.Adaper
1.2 RecyclerView.Adapter
RecyclerView.Adaper
是一个抽象类,并支持泛型:
public abstract static class Adapter<VH extends RecyclerView.ViewHolder> {
...
}
定义一个MyRecyclerViewAdapter
继承RecyclerView.Adaper
,这时候需要重写三个方法。一般会先定义一个Holder继承RecycelrView.ViewHolder
,之后直接在MyRecyclerViewAdapter上,指定泛型就是RecyclerHolder。
三个必须要重写的方法为:
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position)
public int getItemCount()
在指定泛型之后,相应的方法一与方法二会根据泛型改变
在前述的基本用法中,定义了一个叫ViewHolder的内部类,同样是继承RecyclerView的ViewHolder class,这个子类构造器必须调用父类构造器。然后可以在ViewHolder内定义每个列表上的视图控件,并在之后的onCreateViewHolder中初始化这些视图控件。
- onCreateViewHolder(ViewGroup parent, int viewType)
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.fruit_item, parent, false);
ViewHolder holder = new ViewHolder(view);
return holder;
}
这个方法就是用来创建出一个新的ViewHolder
,可以根据需求的itemType
,创建出多个ViewHolder
。创建多个itemType
时,需要getItemViewType(int position)
方法配合
使用inflate作为ViewHolder的layout,并**将layout中的视图控件与ViewHolder中元件属性绑定**。
- onBindViewHolder(RecyclerHolder holder, int position)
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
Fruit fruit = mFruitList.get(position);
holder.fruitImage.setImageResource(fruit.getImageId());
holder.fruitName.setText(fruit.getName());
}
hold是在onCreateViewHolder中创建的ViewHolder,position是item对应的数据列表中数据源集合的position。在这个方法中**设置ViewHolder中视图控件的数据与属性**。
- getItemCount()
@Override
public int getItemCount() {
return mFruitList.size();
}
这个方法的返回值,便是RecyclerView
中实际item
的数量。有些情况下,当增加了HeaderView
或者FooterView
后,需要注意考虑这个返回值
简单示例:
- 在xml文件中添加RecyclerView控件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<android.support.v7.widget.RecyclerView