Android数据列表展示之 RecylerView

一、概述

1.RecyclerView是什么?

RecyclerView是一种新的视图组,目标是为任何基于适配器的视图提供相似的渲染方式。该控件用于在有限的窗口中展示大量数据集,它被作为ListView和GridView控件的继承者。RecyclerView高度解耦,异常灵活,通过设置不同LayoutManager,ItemDecoration , ItemAnimator实现令人想象不到的效果

2.RecyclerView怎么用?

既然RecyclerView的出现是为了要替换ListView和GridView,那么他们必有共通之处,,是的他们都是通过适配器来绑定数据的。

所以RecyclerView需要有如下东西支持:

1.Datas : 要显示的数据集合

2.Adapter:适配器,绑定数据集

3.ViewHolder:根据当前数据保存视图,其实就是列表数据的单个item布局

4.LayoutManager:布局管理者,决定列表数据摆放格式,是按照listview方式摆放还是按照gridview方式摆放,又或者是按照瀑布流方式,这就是Recyclerview强大的地方

5.ItemDecoration:列表的分割器,Recyclerview默认没有给我们提供分割线,需自定义,后续会给出代码

6.ItemAnimator: 当列表item被“添加”、“删除”,“位置变动”时执行什么动画,强大吧!

7.Listener: item事件监听,RecyclerView默认不提供OnItemClickListener 点击事件,需我们自定义,灵活使用。

二、RecyclerView的详细用法

1.适配器和普通的适配器不一样,需要继承RecyclerView.Adapter

2.listview使用时为了使用缓存,我们会定义一个ViewHolder类去存放布局控件,而RecyclerView 默认就支持这种方式,是不是更加方便了。

public class UserAdapter extends RecyclerView.Adapter {
    private List<UserBean> userBeanList;
    private Context mContext;
    public UserAdapter(Context context,List<UserBean> userBeanList){
        mContext = context;
        this.userBeanList = userBeanList;
    }
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = View.inflate(mContext,R.layout.item_recycler_view,null);
        return new UserViewHolder(view);
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        if(holder instanceof UserViewHolder){
            UserViewHolder userViewHolder = (UserViewHolder) holder;
            UserBean userBean  = userBeanList.get(position);
            userViewHolder.name.setText(userBean.getName());
            userViewHolder.number.setText(userBean.getNumber());
        }
    }

    @Override
    public int getItemCount() {
        return userBeanList!=null?userBeanList.size():0;
    }

    class UserViewHolder extends RecyclerView.ViewHolder{
        private TextView name;
        private TextView number;
        public UserViewHolder(View itemView) {
            super(itemView);
            init(itemView);
            //给列表item点击点击事件
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if(itemClickListener!=null){
                        itemClickListener.onItemClick(v,getLayoutPosition());
                    }
                }
            });
        }

        private void init(View view){
            name = (TextView) view.findViewById(R.id.tv_name);
            number = (TextView) view.findViewById(R.id.tv_number);
        }
    }

    //对外部暴漏点击事件接口
    public interface OnItemClickListener{
        void onItemClick(View v,int position);
    }

    public OnItemClickListener itemClickListener;

    public void setItemClickListener(OnItemClickListener itemClickListener) {
        this.itemClickListener = itemClickListener;
    }
}

运行效果:

源码地址:https://yunpan.cn/cu782gq6cEPD8 (提取码:a20d)

原文地址:https://www.cnblogs.com/android-zcq/p/5130087.html