❤️Android RecyclerView 简单使用❤️

3,235 阅读4分钟

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

实例

效果图

代码实现

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<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

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;
    }
}

XRecyclerView

一个 RecyclerView 实现了 pullrefresh 、loadingmore 和 header featrues。你可以像标准的 RecyclerView 一样使用它。 你不需要实现一个特殊的适配器。

XRecyclerView传送门

上面了解到了RecyclerView的简单使用,下面咱来看看其源码。比较现在要求较高不能光会用还得知道其原理。

以上就是本文的全部内容啦,希望对你有所帮助。

往期推荐

Android RecyclerView 绘制流程及Recycler缓存

Android Glide 缓存机制及源码

Android 一文轻松搞定Glide使用