使用步骤
- 在布局文件中添加RecyclerView控件
- 添加一个item布局文件
- 创建一个适配器Adapter类,继承自RecyclerView.Adapter.该适配器负责管理数据集合,并将数据绑定到RecyclerView的每个item项中
- 创建ViewHolder类,继承自RecyclerView.ViewHolder,viewholder表示RecyclerView中每个item项的视图
- 在适配器中实现以下方法
- 'getItemCount()':返回数据集合的大小
- 'onCreateViewHolder()':创建viewHolder对象,即创建RecyclerView中每个项的视图
- 'onBindViewHolder():'将数据绑定到ViewHolder对象中的视图
@Override
public int getItemCount() {
return dataList.size();
}@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false);
return new MyViewHolder(view);
}@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
DataItem item = dataList.get(position);
holder.bindData(item);
}
- 在ViewHolder类中,绑定视图的子视图和处理点击事件等操作
- 在Activity或Fragment中,初始化RecyclerView和Adapter适配器,并设置布局管理器(LayoutManager)
布局管理器
- 三种布局管理器都是通过setLayoutManager方法来设置
- LinearLayoutManager 线性布局管理器
LinearLayoutManager layoutManager = new LinearLayoutManager(MainActivity.this);
layoutManager.setOrientation(RecyclerView.HORIZONTAL);
mRecyclerView.setLayoutManager(layoutManager);
StaggeredGridLayoutManager 瀑布流布局管理器
-
GridLayoutManager 网格布局管理器
GridLayoutManager layoutManager = new GridLayoutManager(MainActivity.this,3);
// layoutManager.setOrientation(RecyclerView.HORIZONTAL); 也能设置横向滚动
mRecyclerView.setLayoutManager(layoutManager);
itemDirection
- 通过给item设置itemDirection来装饰item的效果,假设设置间隔线
DividerItemDecoration mDivider = new
DividerItemDecoration(this,DividerItemDecoration.VERTICAL);
mRecyclerView.addItemDecoration(mDivider);
item动画
- recyclerView提供了默认的itemAnimator的实现类:DefaultItemAnimator,该类可以帮我们实现一些炫酷的动画效果
Button button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
News news = new News();
news.title = "标题 新内容" ;
news.content = "内容 新内容" ;
mNewsList.add(1,news);
mMyAdapter.notifyItemInserted(1);
}
});
Button button1 = findViewById(R.id.button1);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mNewsList.remove(0);
mMyAdapter.notifyItemMoved(0,1);
}
});
item点击
-
我们可以通过对整个item文件的跟布局添加一个点击事件来实现item的点击
i上拉刷新加载更多
- 通常RecyclerView使用的时候需要配合上拉刷新下拉加载更多的动能,可以使用开源控件SmartRefreshLayout来实现SmartRefreshLayout,使用方法如下
-
添加依赖
在gradle文件中添加implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.2'
implementation 'com.scwang.smartrefresh:SmartRefreshHeader:1.1.2' 布局文件
-
在activity_main.xml中SmartRefreshLayout控件将RecyclerView包裹起来
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"><com.scwang.smartrefresh.layout.SmartRefreshLayout
android:id="@+id/refreshLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toTopOf="parent"><androidx.recyclerview.widget.RecyclerView android:id="@+id/recyclerview" android:layout_width="match_parent" android:layout_height="0dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" />
</com.scwang.smartrefresh.layout.SmartRefreshLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
- 逻辑代码
-
在MainActivity的onCreate方法中添加下拉刷新和加载更多的功能
下拉刷新:RefreshLayout refreshLayout = findViewById(R.id.refreshLayout);
refreshLayout.setOnRefreshListener(new OnRefreshListener() {
@Override
public void onRefresh(RefreshLayout refreshlayout) {
refreshlayout.finishRefresh(2000/,false/);//传入false表示刷新失败
mNewsList.clear();
for (int i = 0; i < 10; i++) {
News news = new News();
news.title = "标题 新内容" + i;
news.content = "内容" + i;
mNewsList.add(news);
}
mMyAdapter.notifyDataSetChanged();
}
});上拉加载更多
refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() {
@Override
public void onLoadMore(RefreshLayout refreshlayout) {
refreshlayout.finishLoadMore(2000/,false/);//传入false表示加载失败
for (int i = 0; i < 10; i++) {
News news = new News();
news.title = "标题 新内容" + i;
news.content = "内容" + i;
mNewsList.add(news);
}
mMyAdapter.notifyDataSetChanged();
}
});
总结
- 注意在Acitivity中初始化适配器并且setAdapter
- Adapter中重写的方法与作用以及执行的时机:
1.三个重写方法
onCreateViewHolder
该方法用于创建列表项组件 使用该方法所创建的组件会自动被缓存
onBindViewHolder
该方法负责为列表项组件绑定数据 每次组件重新显示出来时都会重新执行该方法
getItemCount
该方法的返回值决定包含多少个列表项- 执行时机:
每个item的onCreatViewHolder 和onBindViewHolder方法在存储范围内只会执行一次 如果列表特别长 超出范围后 再回滑需要再次执行
当开始执行时可以看到 获取了两次item数量 接着获取到item类型 执行onCreatViewHolder 再执行onBindViewHolder方法
在一个item下滑到完整的第二个item期间 会不断获取item数量和类型
并且在第一次滑动时会根据情况进行预加载后面的item(有时也会不进行预加载)
- 执行时机: