RecyclerView的基础使用与拓展

RecyclerView的基本使用

RecyclerView这个V7包下的控件相信大家都非常熟悉了,面试的时候别人问你你要是说很多条目数据的展示还用ListView这就尴尬了,下面我们就来复习下RecyclerView的使用。

RecyclerView的命名就能知道他只负责View,其他的东西不归它管,Recycler英文的意思是再循环器

RecyclerView的使用步骤说起来也比较简单:

  1. 给RecyclerView设置布局管理器
  2. 给RecyclerView设置适配器

额外的也提供了许多ListView不具备的功能

  • 给每个条目设置下划线
  • 给每个条目加动画

一、基本使用
1.给RecyclerView设置布局管理器

/**A LayoutManager must be provided for RecyclerView to function.*/
// 从源码注释中得知 RecyclerView必须设置布局管理器才能工作
//
mRecyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));

2.接下来就是设置适配器,然后加载数据 通知适配器更新

MyAdapter adapter = new MyAdapter(this, mDataList);

mRecyclerView.setAdapter(adapter);//设置适配器
initData();
adapter.setData(mDataList);        
adapter.notifyDataSetChanged();

二、适配器的基本使用

   首先继承RecyclerView.Adapter,假如所有的条目都一样则只需要复写三个方法onCreateViewHolder( )、onBindViewHolder()、getItemCount(),这三个方法的作用分别是创建返回ViewHolder、给ViewHolder绑定数据、返回条目的数量。

  如果条目显示的布局不一样,则还需要复写getItemViewType,这里返回的viewType将在onCreateViewHolder中通过不同的ViewType返回不同的ViewHolder,在onBindViewHolder通过不同的ViewHolder来区分绑定不同的数据,instance of <判断是否是某个类的实例>

效果展示如下:

        RecyclerView的基础使用与拓展_第1张图片

class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

        private List mPersonList;
        private Context mContext;

        private int TYPE_SMALL = 100;
        private int TYPE_LAGE = 110;


        public MyAdapter(Context context, List data) {
            this.mPersonList = data;
            this.mContext = context;
        }

        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            // 根据不同的ViewType  创建不同的 ViewHolder
            if (viewType == TYPE_SMALL) {
                View view1 = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_holder1, parent, false);
                return new MyViewHolder1(view1);
            } else if (viewType == TYPE_LAGE) {
                return new MyViewHolder2(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_holder2, parent, false));
            }
            return null;
        }


        @Override
        public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
            Person person = mPersonList.get(position);
            // 通过不同的ViewHolder来进行不同数据的绑定
            if (holder instanceof MyViewHolder1) {
                ((MyViewHolder1) holder).ageTv.setText(person.getAge() + "岁");
                ((MyViewHolder1) holder).nameTv.setText("姓名:" + person.getName());
            }

            if (holder instanceof MyViewHolder2) {
                ((MyViewHolder2) holder).ageTv.setText(person.getAge() + "岁");
                ((MyViewHolder2) holder).nameTv.setText("姓名:" + person.getName());
            }
        }


        @Override
        public int getItemCount() {
            // 返回总条目数量
            return mPersonList.size();
        }


        @Override
        public int getItemViewType(int position) {
            // 返回不同的ViewType
            return mPersonList.get(position).getType() == 1 ? TYPE_LAGE : TYPE_SMALL;
        }


        public void setData(List data) {
            mPersonList.addAll(data);
        }

        class MyViewHolder1 extends RecyclerView.ViewHolder {

            TextView nameTv;
            TextView ageTv;

            public MyViewHolder1(View itemView) {
                super(itemView);
                nameTv = itemView.findViewById(R.id.name);
                ageTv = itemView.findViewById(R.id.age);
            }
        }

        class MyViewHolder2 extends RecyclerView.ViewHolder {

            TextView nameTv;
            TextView ageTv;

            public MyViewHolder2(View itemView) {
                super(itemView);
                nameTv = itemView.findViewById(R.id.name);
                ageTv = itemView.findViewById(R.id.age);
            }
        }
    }

以上是最基本的使用,假设这么一种情况,你的每个条目下需要一条分割线来进行美化,你可以在item项的布局文件中加上一条,也可以通过RecyclerView提供的方法来设置。

// 给每个条目之间加上分割线
mRecyclerView.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.HORIZONTAL));

你可能感兴趣的:(recyclerview使用)