RecycleView Adapter 方法与作用及执行时机

本文详细解析了RecyclerView.Adapter中的关键方法:onCreateViewHolder、onBindViewHolder和getItemCount。onCreateViewHolder用于创建列表项视图,缓存复用;onBindViewHolder负责绑定数据到视图,每次组件重新显示时执行;getItemCount确定列表项数量。文章通过实例展示了这些方法的执行时机,包括预加载机制,帮助读者深入理解列表滚动时的数据绑定过程。

方法与作用

创建一个adapter后需要重写三个方法

  1. onCreateViewHolder
    该方法用于创建列表项组件 使用该方法所创建的组件会自动被缓存
  2. onBindViewHolder
    该方法负责为列表项组件绑定数据 每次组件重新显示出来时都会重新执行该方法
  3. getItemCount
    该方法的返回值决定包含多少个列表项
public class FeedAdapter extends RecyclerView.Adapter<BaseHolder> {

    private Context mContext;

    private ArrayList<FeedVideoDate> feedList;
    private ArrayList<FeedImageDate> feedImageList;

    private RecyclerView feedRecycleView;
//    private OnItemClickListener listener;

    private FeedRecommendAdapter feedRecommendAdapter;

    private FeedVideoHolder feedVideoHolder;

    private FeedImageHolder feedImageHolder;

    public FeedAdapter(ArrayList<FeedVideoDate> feedList, ArrayList<FeedImageDate> feedImageList, Context context) {
        this.feedImageList = feedImageList;
        this.feedList = feedList;
        this.mContext = context;
    }

    @Override
    public int getItemViewType(int position) {
        Log.i("AAAAAAAgetItemViewType","获取item类型+++++++");
        return feedList.get(position).getViewType();

    }

    @Override
    public BaseHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        Log.i("AAAAACreateViewHolder","创建onCreateViewHolder+++++++");
        switch (viewType) {
            case FeedVideoDate.VIEW_TYPE_IMAGE:
                return new FeedImageHolder(LayoutInflater.from(mContext).inflate(R.layout
                        .feed_item_image, parent, false));
            case FeedVideoDate.VIEW_TYPE_VIDEO:
                return new FeedVideoHolder(LayoutInflater.from(mContext).inflate(R.layout
                        .feed_item_video, parent, false));
            default:
                return new FeedBlankHolder(LayoutInflater.from(mContext).inflate(R.layout
                        .feed_item_blank, parent, false));

        }
    }

    @Override
    public void onBindViewHolder(BaseHolder holder, int position) {
        Log.i("AAAAAonBindViewHolder","onBindViewHolder+++++++");

        if (feedList.get(position).getViewType() == FeedVideoDate.VIEW_TYPE_IMAGE) {
            holder.bindData(feedImageList.get(position));
        } else {
            holder.bindData(feedList.get(position));
        }
    }


    @Override
    public int getItemCount() {
        Log.i("AAAAAgetItemCount","获取item数量+++++++");
         if (feedList != null) {
            return feedList.size();
        } else {
            return 0;
        }
    }
}

各方法执行时机

每个item的onCreatViewHolder 和onBindViewHolder方法在存储范围内只会执行一次 如果列表特别长 超出范围后 再回滑需要再次执行

当开始执行时可以看到 获取了两次item数量 接着获取到item类型 执行onCreatViewHolder 再执行onBindViewHolder方法
在这里插入图片描述

在一个item下滑到完整的第二个item期间 会不断获取item数量和类型
并且在第一次滑动时会根据情况进行预加载后面的item(有时也会不进行预加载)

在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值