我有一个包含视图的RecyclerView
,当点击某个视图时,该行的视图将被禁用。
问题是在我像这样更新适配器后:
adapterData.clear();
adapterData.addAll(refreshedAdapterData);
notifyDataSetChanged();
在刷新数据之后,尽管数据已经更新,但前一个回收器位置的禁用视图仍然保持禁用状态。我该如何在刷新适配器数据后将视图重置为原始状态。
我有一个包含视图的RecyclerView
,当点击某个视图时,该行的视图将被禁用。
问题是在我像这样更新适配器后:
adapterData.clear();
adapterData.addAll(refreshedAdapterData);
notifyDataSetChanged();
在刷新数据之后,尽管数据已经更新,但前一个回收器位置的禁用视图仍然保持禁用状态。我该如何在刷新适配器数据后将视图重置为原始状态。
adapterData.clear();
adapterData.addAll(refreshedAdapterData);
adapter.notifyDataSetChanged();
或者
recyclerView.invalidate();
当你调用notifyDataSetChanged()
方法时,每个视图的onBindViewHolder()
方法将被调用。因此,你可以在你的Adapter
方法的onBindViewHolder()
中添加以下内容:
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder viewHolder, final int position) {
if (refreshedAdapterData.get(position).isInDefaultState()) {
//set Default View Values
} else {
//the code you already have
}
}
我通过在onBindViewHolder方法中放置一个条件语句来解决了这个问题,如果数据满足刷新数据的要求,则指示所有位置重置禁用视图。
@Christoph Mayr,感谢您的评论。它帮助我找到了正确的方向。
我清除了数据然后通知了更改,但选择的复选框没有重置,而只是上移了一个位置。假设我选择了项目#1,移出RecyclerView,再返回它将自动选择项目#0。
所以,在onResume()中我创建了新的适配器,这对我有用,但我不知道这是否是处理此情况的正确方法。
@Override
public void onResume() {
super.onResume();
if(selectedItems != null && selectedItems.size() > 0){
selectedItems.clear(); // if no selected items before then no need to reset anything
if(adapter != null && recyclerView != null){
// to remove the checked box
adapter = null;
adapter = new MyAdapter(items, new MyAdapter.MyAdapterListener() {
@Override
public void onSelected(int pos) {
selectedItems.add(items.get(pos));
}
@Override
public void onUnSelected(int pos) {
selectedItems.remove(items.get(pos));
}
});
recyclerView.setAdapter(adapter);
}
}
}