问题分析:
recyclerview 更新数据和UI过程是:获取holder类型->产生holder->获取holder()->holder+data->展示。
getItemViewType() -> onCreateViewHolder() -> onBindViewHolder()
adapter中:
1.获取某个位置的holder类型。
@Override
public int getItemViewType(int position) {
return position;
}2.创建holder 。
@NonNull
@Override
public RecyclerViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
// 创建绑定关系
ViewDataBinding viewDataBinding = DataBindingUtil.inflate(inflater, layoutId, parent, false);
// 建立ViewHolder
RecyclerViewHolder viewHolder = new RecyclerViewHolder(viewDataBinding.getRoot());
// 将绑定关系设置到ViewHolder
viewHolder.setViewDataBinding(viewDataBinding);
return viewHolder;
}3.绑定数据并展示出来。
@Override
public void onBindViewHolder(@NonNull RecyclerViewHolder holder, final int position) {
// 从ViewHolder中取出绑定关系
ViewDataBinding viewDataBinding = holder.getViewDataBinding();
// 执行绑定,给绑定关系设置数据。
viewDataBinding.setVariable(variableId, data.get(position));
// 立即执行
viewDataBinding.executePendingBindings();
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onItemClickListener.onItemClick(position);
}
});
}自定义ViewHolder
public static class RecyclerViewHolder extends RecyclerView.ViewHolder {
private ViewDataBinding mViewDataBinding;
public RecyclerViewHolder(@NonNull View itemView) {
super(itemView);
}
public ViewDataBinding getViewDataBinding() {
return mViewDataBinding;
}
public void setViewDataBinding(ViewDataBinding viewDataBinding) {
mViewDataBinding = viewDataBinding;
}
}
由于RecyclerView的onBindViewHolder()方法,只有在getItemViewType()返回类型不同时才会调用,
在onBindViewHolder()方法中,执行了了viewDataBinding.setVariable(variableId, data.get(position));
每次都调用了onBindViewHolder()刷新item数据,就需要重写getItemViewType(),让其返回position,否则很容易产生数
据错乱。
版权声明:本文为baidu_35701759原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。