-
Binding:准备子视图以显示与适配器内某个位置对应的数据的过程。
-
Recycle(view):Recycler 负责管理报废或分离的项目视图以供重用。
-
Scrap(view):在布局过程中进入临时分离状态的子视图。废弃视图可以被重用,而不会与父 RecyclerView 完全分离,如果不需要重新绑定则不修改,或者如果视图被认为是脏的,则由适配器修改。
-
Dirty(view):必须由适配器重新绑定才能显示的子视图。
常用方法
-
setLayoutManager:必选项,设置 RecyclerView 的布局管理器,决定RecyclerView 的显示风格。常用的有线性布局管理器(LinearLayoutManager)、网格布局管理器(GridLayoutManager)、瀑布流布局管理器(StaggeredGridLayoutManager)。
-
setAdapter:必选项,设置 RecyclerView 的数据适配器。当数据发生改变时,以通知者的身份,通知 RecyclerView 数据改变进行列表刷新操作。
-
addItemDecoration:非必选项,设置 RecyclerView中 Item 的装饰器,经常用来设置 Item 的分割线。
-
setItemAnimator:非必选项,设置 RecyclerView中 Item 的动画。
定义Adapter
你需要替换三个关键方法:
-
onCreateViewHolder():每当 RecyclerView 需要创建新的 ViewHolder 时,它都会调用此方法。此方法会创建并初始化 ViewHolder 及其关联的 View,但不会填充视图的内容,因为 ViewHolder 此时尚未绑定到具体数据。
-
onBindViewHolder():RecyclerView 调用此方法将 ViewHolder 与数据相关联。此方法会提取适当的数据,并使用该数据填充 ViewHolder 的布局。例如,如果 RecyclerView 显示的是一个名称列表,该方法可能会在列表中查找适当的名称,并填充 ViewHolder 的 TextView widget。
-
getItemCount():RecyclerView 调用此方法来获取数据集的大小。例如,在通讯簿应用中,这可能是地址总数。RecyclerView 使用此方法来确定什么时候没有更多的列表项可以显示。
实例
==
效果图
代码实现
RecyclerViewActivity
public class RecyclerViewActivity extends ActivityBase{
ActivityRecyclerviewBinding recyclerviewBinding;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
recyclerviewBinding = ActivityRecyclerviewBinding.inflate(getLayoutInflater());
setContentView(recyclerviewBinding.getRoot());
LinearLayoutManager llManager = new LinearLayoutManager(this);
//默认垂直展示,这里设置为水平显示
llManager.setOrientation(LinearLayoutManager.HORIZONTAL);
//设置 RecyclerView 的布局管理器
recyclerviewBinding.rvUserinfo.setLayoutManager(llManager);
List userList = new ArrayList<>();
userList.add(new UserInfo(“苏妲己”, R.mipmap.scc_1));
…
userList.add(new UserInfo(“王昭君”, R.mipmap.scc_7));
BaseRecyclerAdapter adapter = new BaseRecyclerAdapter(this,userList) {
@Override
public int getItemLayoutId(int viewType) {
return R.layout.item_rv_userinfo;
}
@Override
public void convert(RecyclerViewHolder holder, int position, UserInfo bean) {
holder.setText(R.id.tv_name,bean.getName());
holder.setText(R.id.tv_content,bean.getContent());
holder.setImageResource(R.id.iv_head,bean.getHead());
}
};
//设置 RecyclerView 的数据适配器。
recyclerviewBinding.rvUserinfo.setAdapter(adapter);
//addItemDecoration
recyclerviewBinding.rvUserinfo.addItemDecoration(new RvDividerItemDecoration(this,10));
}
}
activity_recyclerview.xml
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android=“http://schemas.android.com/apk/res/android”
android:layout_width=“match_parent”
android:layout_height=“match_parent”>
<androidx.recyclerview.widget.RecyclerView
android:id=“@+id/rv_userinfo”
android:layout_width=“match_parent”
android:layout_height=“match_parent”/>
item_rv_userinfo.xml
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android=“http://schemas.android.com/apk/res/android”
android:layout_width=“wrap_content”
android:layout_height=“match_parent”>
<ImageView
android:id=“@+id/iv_head”
…/>
<TextView
android:id=“@+id/tv_name”
…/>
<TextView
android:id=“@+id/tv_content”
…/>
BaseRecyclerAdapter
public abstract class BaseRecyclerAdapter extends RecyclerView.Adapter {
protected final List mData;
protected final Context mContext;
protected LayoutInflater mInflater;
private OnItemClickListener mClickListener;
private OnItemLongClickListener mLongClickListener;
public BaseRecyclerAdapter(Context ctx, List list) {
mData = (list != null) ? list : new ArrayList();
mContext = ctx;
mInflater = LayoutInflater.from(ctx);
}
@Override
public RecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
创建一个新视图,该视图定义item的UI
final RecyclerViewHolder holder = new RecyclerViewHolder(mContext,
mInflater.inflate(getItemLayoutId(viewType), parent, false));
if (mClickListener != null) {
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mClickListener.onItemClick(holder.itemView, holder.getLayoutPosition());
}
});
}
if (mLongClickListener != null) {
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
mLongClickListener.onItemLongClick(holder.itemView, holder.getLayoutPosition());
return true;
}
});
}
return holder;
}
@Override
public void onBindViewHolder(RecyclerViewHolder holder, int position) {
convert(holder, position, mData.get(position));
}
@Override
public int getItemCount() {
return mData.size();
}
public void add(int pos, T item) {
mData.add(pos, item);
notifyItemInserted(pos);
}
public void delete(int pos) {
mData.remove(pos);
notifyItemRemoved(pos);
}
public void setOnItemClickListener(OnItemClickListener listener) {
如果你进阶的路上缺乏方向,可以加入我们的圈子和安卓开发者们一起学习交流!
-
Android进阶学习全套手册
-
Android对标阿里P7学习视频
-
BATJ大厂Android高频面试题
最后,借用我最喜欢的乔布斯语录,作为本文的结尾:
人这一辈子没法做太多的事情,所以每一件都要做得精彩绝伦。
你的时间有限,所以不要为别人而活。不要被教条所限,不要活在别人的观念里。不要让别人的意见左右自己内心的声音。
最重要的是,勇敢的去追随自己的心灵和直觉,只有自己的心灵和直觉才知道你自己的真实想法,其他一切都是次要。
加入社区》https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0
-
Android对标阿里P7学习视频
[外链图片转存中…(img-TkoocP0H-1725638786645)]
-
BATJ大厂Android高频面试题
[外链图片转存中…(img-A2K9FquL-1725638786645)]
最后,借用我最喜欢的乔布斯语录,作为本文的结尾:
人这一辈子没法做太多的事情,所以每一件都要做得精彩绝伦。
你的时间有限,所以不要为别人而活。不要被教条所限,不要活在别人的观念里。不要让别人的意见左右自己内心的声音。
最重要的是,勇敢的去追随自己的心灵和直觉,只有自己的心灵和直觉才知道你自己的真实想法,其他一切都是次要。
加入社区》https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0