Android。当我更改模型时,onBindViewHolder 中的任何方法都会重复执行
Android. Any method inside onBindViewHolder executes repeatedly when I change model
我正在使用 recyclerView
和 databinding
。
它工作正常,但是当我试图在 onBindViewHolder
方法中更改绑定模型时,我得到了一个奇怪的行为:该方法重复执行。
这是我的 adapter
:
public class TasksLevelAdapter extends RealmRecyclerViewAdapter<RealmArticle, TasksLevelAdapter.MyViewHolder> {
private String TAG = "MYAPP";
protected TasksLevelAdapter(OrderedRealmCollection<RealmArticle> data, Activity mActivity) {
super(data, true);
setHasStableIds(true);
this.mActivity = mActivity;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater layoutInflater =
LayoutInflater.from(parent.getContext());
RowRecyclerviewMainBinding itemBinding =
RowRecyclerviewMainBinding.inflate(layoutInflater, parent, false);
return new MyViewHolder(itemBinding);
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
final RealmArticle obj = getItem(position);
int idTask = obj.getIdTask();
holder.data = obj;
holder.bind(obj);
Log.e(TAG, new Date().getTime() + "");
new Handler().postDelayed(new Runnable() { // - when I add this handler I'm getting it called repeatedly
@Override
public void run() {
Realm.getDefaultInstance()
.executeTransaction(trans -> obj.setItemsCount("111"));
}
}, 1000);
}
@Override
public long getItemId(int index) {
return getItem(index).getIdTaskart();
}
class MyViewHolder extends RecyclerView.ViewHolder {
private final RowRecyclerviewMainBinding binding;
private RealmArticle data;
public MyViewHolder(RowRecyclerviewMainBinding binding) {
super(binding.getRoot());
this.binding = binding;
}
public void bind(RealmArticle obj) {
binding.setObj(obj);
binding.executePendingBindings();
}
}
}
当我删除 onBindViewHolder
中的 handler
时,Log.e
只执行一次。
为什么我更改模型时 OnbindViewHolder
中的方法会重复执行?以及如何避免这种情况?
您创建了启用了自动更新的适配器:
super(data, true);
在您发布的 Runnable
中,您更改了绑定对象的数据,因此触发了更新。这就是再次调用 onBindViewHolder()
的原因。
一起使用自动更新和数据绑定似乎有点多余。如果 RealmArticle
是数据绑定可观察对象,则可能不使用自动更新进行更新。所以只需禁用 updateOnModification
.
super(data, true, false);
我正在使用 recyclerView
和 databinding
。
它工作正常,但是当我试图在 onBindViewHolder
方法中更改绑定模型时,我得到了一个奇怪的行为:该方法重复执行。
这是我的 adapter
:
public class TasksLevelAdapter extends RealmRecyclerViewAdapter<RealmArticle, TasksLevelAdapter.MyViewHolder> {
private String TAG = "MYAPP";
protected TasksLevelAdapter(OrderedRealmCollection<RealmArticle> data, Activity mActivity) {
super(data, true);
setHasStableIds(true);
this.mActivity = mActivity;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater layoutInflater =
LayoutInflater.from(parent.getContext());
RowRecyclerviewMainBinding itemBinding =
RowRecyclerviewMainBinding.inflate(layoutInflater, parent, false);
return new MyViewHolder(itemBinding);
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
final RealmArticle obj = getItem(position);
int idTask = obj.getIdTask();
holder.data = obj;
holder.bind(obj);
Log.e(TAG, new Date().getTime() + "");
new Handler().postDelayed(new Runnable() { // - when I add this handler I'm getting it called repeatedly
@Override
public void run() {
Realm.getDefaultInstance()
.executeTransaction(trans -> obj.setItemsCount("111"));
}
}, 1000);
}
@Override
public long getItemId(int index) {
return getItem(index).getIdTaskart();
}
class MyViewHolder extends RecyclerView.ViewHolder {
private final RowRecyclerviewMainBinding binding;
private RealmArticle data;
public MyViewHolder(RowRecyclerviewMainBinding binding) {
super(binding.getRoot());
this.binding = binding;
}
public void bind(RealmArticle obj) {
binding.setObj(obj);
binding.executePendingBindings();
}
}
}
当我删除 onBindViewHolder
中的 handler
时,Log.e
只执行一次。
为什么我更改模型时 OnbindViewHolder
中的方法会重复执行?以及如何避免这种情况?
您创建了启用了自动更新的适配器:
super(data, true);
在您发布的 Runnable
中,您更改了绑定对象的数据,因此触发了更新。这就是再次调用 onBindViewHolder()
的原因。
一起使用自动更新和数据绑定似乎有点多余。如果 RealmArticle
是数据绑定可观察对象,则可能不使用自动更新进行更新。所以只需禁用 updateOnModification
.
super(data, true, false);