方法与作用
创建一个adapter后需要重写三个方法
- onCreateViewHolder
该方法用于创建列表项组件 使用该方法所创建的组件会自动被缓存 - onBindViewHolder
该方法负责为列表项组件绑定数据 每次组件重新显示出来时都会重新执行该方法 - 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(有时也会不进行预加载)