Android RecyclerView的简单使用

简介: RecyclerView 是作为 ListView 和 GridView 的加强版出现的,目的是在有限的屏幕之上展示大量的内容,因此 RecyclerView 的复用机制的实现是它的一个核心部分,复用机制可以显著提高性能,改善应用响应能力并降低功耗。

RecyclerView介绍


       RecyclerView是作为 ListView 和 GridView 的加强版出现的,目的是在有限的屏幕之上展示大量的内容,因此 RecyclerView 的复用机制的实现是它的一个核心部分,复用机制可以显著提高性能,改善应用响应能力并降低功耗。


注意:


RecyclerView 除了是类的名称,也是库的名称。RecyclerView 始终表示 RecyclerView 库中的类。


专业术语


  • Adapter:RecyclerView.Adapter负责提供表示数据集中项目的视图的子类。


  • Position:数据项在Adapter 中的位置。


  • Index:在调用中使用的附加子视图的索引 ViewGroup.getChildAt(int)。与位置相对。


  • 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 使用此方法来确定什么时候没有更多的列表项可以显示。


实例


效果图

微信图片_20220525160127.gif


代码实现


RecyclerViewActivity


1.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<UserInfo> userList = new ArrayList<>();
        userList.add(new UserInfo("苏妲己", R.mipmap.scc_1));
        ...
        userList.add(new UserInfo("王昭君", R.mipmap.scc_7));
        BaseRecyclerAdapter<UserInfo> adapter = new BaseRecyclerAdapter<UserInfo>(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"/>
</RelativeLayout>


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"
        .../>
</RelativeLayout>


BaseRecyclerAdapter


1.public abstract class BaseRecyclerAdapter<T> extends RecyclerView.Adapter<RecyclerViewHolder> {
    protected final List<T> mData;
    protected final Context mContext;
    protected LayoutInflater mInflater;
    private OnItemClickListener mClickListener;
    private OnItemLongClickListener mLongClickListener;
    public BaseRecyclerAdapter(Context ctx, List<T> list) {
        mData = (list != null) ? list : new ArrayList<T>();
        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) {
        mClickListener = listener;
    }
    public void setOnItemLongClickListener(OnItemLongClickListener listener) {
        mLongClickListener = listener;
    }
    abstract public int getItemLayoutId(int viewType);
    abstract public void convert(RecyclerViewHolder holder, int position, T bean);
    public interface OnItemClickListener {
        public void onItemClick(View itemView, int pos);
    }
    public interface OnItemLongClickListener {
        public void onItemLongClick(View itemView, int pos);
    }
}


RecyclerViewHolder


public class RecyclerViewHolder extends RecyclerView.ViewHolder {
    private SparseArray<View> mViews;//集合类,layout里包含的View,以view的id作为key,value是view对象
    private Context mContext;//上下文对象
    public RecyclerViewHolder(Context ctx, View itemView) {
        super(itemView);
        mContext = ctx;
        mViews = new SparseArray<View>();
    }
    private <T extends View> T findViewById(int viewId) {
        View view = mViews.get(viewId);
        if (view == null) {
            view = itemView.findViewById(viewId);
            mViews.put(viewId, view);
        }
        return (T) view;
    }
    public View getView(int viewId) {
        return findViewById(viewId);
    }
    public TextView getTextView(int viewId) {
        return (TextView) getView(viewId);
    }
    public Button getButton(int viewId) {
        return (Button) getView(viewId);
    }
    public ImageView getImageView(int viewId) {
        return (ImageView) getView(viewId);
    }
    public ImageButton getImageButton(int viewId) {
        return (ImageButton) getView(viewId);
    }
    public EditText getEditText(int viewId) {
        return (EditText) getView(viewId);
    }
    public RecyclerViewHolder setText(int viewId, String value) {
        TextView view = findViewById(viewId);
        view.setText(MStringUtils.isNullOrEmpty(value) ? "" : value);
        return this;
    }
    public RecyclerViewHolder setVisible(int viewId, int visible) {
        View view = findViewById(viewId);
        view.setVisibility(visible);
        return this;
    }
    public RecyclerViewHolder setBackground(int viewId, int resId) {
        View view = findViewById(viewId);
        view.setBackgroundResource(resId);
        return this;
    }
    public RecyclerViewHolder setImageResource(int viewId, int resId) {
        ImageView view = findViewById(viewId);
        view.setImageResource(resId);
        return this;
    }
    public RecyclerViewHolder setClickListener(int viewId, View.OnClickListener listener) {
        View view = findViewById(viewId);
        view.setOnClickListener(listener);
        return this;
    }
}


以上就是部分代码,其他的不重要的就没贴,希望对你有所帮助。你可以根据自己的情况修改上面的代码,要知道适合自己的才是最好的。


相关推荐


RecycleView 不显示、显示不全及滑动卡顿

相关文章
|
7月前
|
API Android开发 开发者
Android UI设计: 什么是RecyclerView?为什么它比ListView更好?
Android UI设计: 什么是RecyclerView?为什么它比ListView更好?
100 2
|
缓存 Android开发
Android RecyclerView 实现瀑布流
Android RecyclerView 实现瀑布流
|
Android开发
Android RecyclerView的notify方法和动画的刷新详解(二)
Android RecyclerView的notify方法和动画的刷新详解
302 0
|
Android开发
Android RecyclerView 使用大全 - 基础使用,item 动画,下拉刷新等(三)
Android RecyclerView 使用大全 - 基础使用,item 动画,下拉刷新等
|
Android开发
Android RecyclerView 使用大全 - 基础使用,item 动画,下拉刷新等(一)
Android RecyclerView 使用大全 - 基础使用,item 动画,下拉刷新等
|
3月前
|
Android开发 开发者 索引
Android实战经验之如何使用DiffUtil提升RecyclerView的刷新性能
本文介绍如何使用 `DiffUtil` 实现 `RecyclerView` 数据集的高效更新,避免不必要的全局刷新,尤其适用于处理大量数据场景。通过定义 `DiffUtil.Callback`、计算差异并应用到适配器,可以显著提升性能。同时,文章还列举了常见错误及原因,帮助开发者避免陷阱。
269 9
|
3月前
|
存储 缓存 Android开发
Android RecyclerView 缓存机制深度解析与面试题
本文首发于公众号“AntDream”,详细解析了 `RecyclerView` 的缓存机制,包括多级缓存的原理与流程,并提供了常见面试题及答案。通过本文,你将深入了解 `RecyclerView` 的高性能秘诀,提升列表和网格的开发技能。
77 8
|
4月前
|
存储 Android开发 开发者
Android项目架构设计问题之定义RecyclerView的ViewHolder如何解决
Android项目架构设计问题之定义RecyclerView的ViewHolder如何解决
52 0
|
4月前
|
数据可视化 Java 数据挖掘
Android项目架构设计问题之设置RecyclerView的LayoutManager如何解决
Android项目架构设计问题之设置RecyclerView的LayoutManager如何解决
39 0
|
6月前
|
API Android开发 开发者
`RecyclerView`是Android API 21引入的UI组件,用于替代ListView和GridView
【6月更文挑战第26天】`RecyclerView`是Android API 21引入的UI组件,用于替代ListView和GridView。它提供高效的数据视图复用,优化的布局管理,支持多种布局(如线性、网格),并解耦数据、适配器和视图。RecyclerView的灵活性、性能(如局部刷新和动画支持)和扩展性使其成为现代Android开发的首选,特别是在处理大规模数据集时。
73 2