关于RecycleView以及适配器内的各个方法怎么使用

  • 跟着郭神的第一行代码学的RecycleView,也用了挺长时间了,但一直都是处于一种懵懂的状态,不理解RecycleView的适配器的各个方法怎么使用和调用的,敲代码时也是不断网上搜方法,ctrl+c/v,在不断的搜索和对比下,我终于搞清楚了RecycleView具体来讲是适配器各方法的基本使用的顺序和作用,在这里我做个浅陋的汇总。
  • 首先要使用RecycleView得先建立一个适配器FruitAdapter继承自RecycleView.Adapter父类(适配器说白了也就是一个功能类,包含了实现滚动显示的大部分方法。)(当然在此之前要先创建一个数据类,依赖库我直接添加的第一行代码里的版本),然后就是创建一个继承RecyclerView.ViewHolder的内部类,这个类就一个构造方法,用来实例化RecycleView布局的控件:然后再来定义适配器的构造方法,这个只用来绑定布局

在这里插入图片描述

后面就是继承了RecycleView.Adapter后要固定继承的三个方法:

  1. onCreateViewHolder(View Group parent,int ViewType)
    这个方法主要是根据加载进来的RecycleView的布局文件来创建一个ViewHolder实例(对于ViewHolder我的理解是作为一个View的容器,并将通过findviewbyid方法获取的view存放到ViewHolder中,方便下次屏幕滚动时获取,实现itemview的循环利用)最后再把viewholder实例返回。同时也是在这个方法体里边定义点击每个item的逻辑功能的:
  2. onBindViewHolder( ViewHolder holder, int position)
    这个方法主要是为每个item进行数据填充,会在每次需要更新view的时候调用相当于在这里将每个item填充好数据后放进viewholder中存储。
  3. getItemCount()
    此方法返回传入数据源的长度,也就是返回多少个列表项。
    在每次滑动列表的时候onCreateViewHolde和onBindViewHolder两个方法都会被调用。

下面附具体代码:

public  class FruitAdapter extends RecyclerView.Adapter<FruitAdapter.ViewHolder>{

    private List<Fruit> mFruitList;

    static class ViewHolder extends RecyclerView.ViewHolder{
        View fruitView;
        ImageView fruitImage;
        TextView fruitName;
        public ViewHolder(View view){
            super(view);
            fruitView=view;
            fruitImage=(ImageView)view.findViewById(R.id.fruit_image);
            fruitName=(TextView)view.findViewById(R.id.fruit_name);
        }
    }
    public FruitAdapter(List<Fruit> fruitList) {
        mFruitList=fruitList;
        //绑定传入的数据源
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.fruit_item,parent,false);
        final ViewHolder holder=new ViewHolder(view);
        holder.fruitView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int position=holder.getAdapterPosition();
                Fruit fruit=mFruitList.get(position);
                Toast.makeText(v.getContext(),"你 click view "+fruit.getName(),Toast.LENGTH_SHORT).show();
            }
        });
        holder.fruitImage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int position=holder.getAdapterPosition();
                Fruit fruit=mFruitList.get(position);
                Toast.makeText(v.getContext(),"you click image "+fruit.getName(),Toast.LENGTH_SHORT).show();
            }
        });
        return holder;
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        Fruit fruit=mFruitList.get(position);
        holder.fruitImage.setImageResource(fruit.getImageId());
        holder.fruitName.setText(fruit.getName());
    }

    @Override
    public int getItemCount() {
        return mFruitList.size();
    }
}

新手上路,如果哪里有错,欢迎指出。
//———————————————————————————————————————————//
关于recycleview的适配器,我现在有了更深入的理解:

RecyclerView的任务就是回收和定位屏幕上的View。

Adapter是Recycleview用来创建ViewHolder的,RecyclerView并不会创建视图。Adapter是一个控制器(适配器)对象,从模型层获取数据,然后提供给RecyclerView显示,起到桥梁的作用。

ViewHolder只做一件事,就是容纳View视图,类似于一种viewgroup。

流程如下:

  1. 首先创建Adapter,使其继承RecyclerView.Adapter并将泛型设置成Adapter.ViewHolder。
  2. 实现Adapter的构造方法,获取将要处理显示的数据。同时创建内部类ViewHolder继承RecyclerView.ViewHolder,它存储了我们要加载的view的所有子view结构,用来实现各个组件的绑定,避免了每次获取数据都需要使用findviewById方法的滥用。 当需要再次展示的话我们就不需要重新加载整个view
  3. 重写Adapter的getItemCount()方法,询问数组列表中的对象数量。
  4. 然后重写onCreateViewHolder方法,通过LayoutInflater.from(parent.getContext()).inflate将view绑定为每个条目的布局,创建ViewHolder 实例并将view传入,最后返回。
  5. RecyclerView会传入ViewHolder及其位置,调用onBindViewHolder(ViewHolder ,int)方法。adapter会找到目标位置的数据并且绑定到ViewHolder视图上。绑定就是使用模型数据填充视图。 同时在onBindViewHolder中设置点击事件,需要注意的是是通过holder.itemView来点击的,因为itemview你可以把它理解成每一个布局,那么就需要对每一个布局进行点击事件的处理。

三个过程完成后,RecyclerView就能在屏幕上显示View了,另外createViewHolder以及onBindViewHolder使用并不频繁。当RecyclerView需要一个新的类型的item的ViewHolder的时候才会调用这个方法,创建够用的ViewHolder就停止调用了(根据屏幕上显示的viewholder对象的数量)。然后会自动回收旧的ViewHolder来节约时间和节省内存。

针对继承RecyclerView.Adapter所定义的泛型,目前还没有搞懂。
/———————————————————————————————————————————/
因为RecyclerView.Adapter源码中指定了泛型的上界,所以同时需要一个ViewHolder继承自RecyclerView.ViewHolder,父类ViewHolder会封装RecyclerView需要的代码,子类需要自己对暴露的抽象方法进行业务代码的添加。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值