Android RecyclerView的简单使用

  • 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进阶学习全套手册

    img

  • Android对标阿里P7学习视频

    img

  • BATJ大厂Android高频面试题

    img

最后,借用我最喜欢的乔布斯语录,作为本文的结尾:

人这一辈子没法做太多的事情,所以每一件都要做得精彩绝伦。
你的时间有限,所以不要为别人而活。不要被教条所限,不要活在别人的观念里。不要让别人的意见左右自己内心的声音。
最重要的是,勇敢的去追随自己的心灵和直觉,只有自己的心灵和直觉才知道你自己的真实想法,其他一切都是次要。

加入社区》https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0

  • Android对标阿里P7学习视频

    [外链图片转存中…(img-TkoocP0H-1725638786645)]

  • BATJ大厂Android高频面试题

    [外链图片转存中…(img-A2K9FquL-1725638786645)]

最后,借用我最喜欢的乔布斯语录,作为本文的结尾:

人这一辈子没法做太多的事情,所以每一件都要做得精彩绝伦。
你的时间有限,所以不要为别人而活。不要被教条所限,不要活在别人的观念里。不要让别人的意见左右自己内心的声音。
最重要的是,勇敢的去追随自己的心灵和直觉,只有自己的心灵和直觉才知道你自己的真实想法,其他一切都是次要。

加入社区》https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值