[英]Does notifydatasetchanged call onCreateViewHolder when using RecyclerView
我想使用切换在两个不同的视图之间切换,但使用相同的RecyclerView
。 基本上,一旦您切换,我希望RecyclerView
适配器调用onCreateViewHolder()
但这次它将使用不同的布局项文件。
notifydatasetchanged()
是否会导致适配器自行重建? 或者还有其他方法吗?
我的RecyclerView
Adapter
上的View
也需要有两种类型,一种用于“常规”模式,另一种用于多选模式。
因此,您可以覆盖getItemViewType
以强制适配器为所有视图调用您的onCreateViewHolder
。
将此添加到Adapter
代码:
public void setActionMode(ActionMode actionMode) {
this.actionMode = actionMode;
notifyDataSetChanged();
}
@Override
public int getItemViewType(int position) {
return (actionMode == null ? 0 : 1);
}
将此添加到ViewHolder
:
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view;
if (viewType == 0) {
view = inflater.inflate(R.layout.layout_1, parent, false);
} else {
view = inflater.inflate(R.layout.layout_2, parent, false);
}
...
}
由于您在ActionMode
返回不同的ViewType
,因此 Adapter 被迫丢弃所有创建的视图,并重新创建所有内容。
notifyDataSetChanged()
在RecyclerView
情况下调用onBindViewHolder()
最好/最简单的解决方案
如果你想刷新 RecyclerView 项目和 onCreateView() 也被调用,比如网格和列表。 这是如何做到这一点。 科特林
fun refreshRecyclerView(recyclerView:RecyclerView){
val adapterRef=recyclerView.adapter
recyclerView.adapter=null
recyclerView.adapter=adapterRef
}
爪哇
void refreshRecyclerView(RecyclerView recyclerView){
Adapter adapterRef=recyclerView.getAdapter();
recyclerView.setAdapter(null);
recyclerView.setAdapter(adapterRef);
}
要删除和更新RecyclerView
布局,您可以调用
mRecyclerView.removeView(view);
或者
mRecyclerView.removeViewAt(position);
删除数据集中的对象后
我在这个问题上花了 6 多个小时没有任何成功。 最后!!! 我在适配器中设置了一个全局变量,并且每次我将视图从列表切换到网格时都必须设置它(在我的情况下)。 这种方法很有趣,但我忘了把它当作静态的!! 所以我的解决方案可能与你的有关,试试吧,希望它能奏效。
public static int mCurrentViewType;
然后覆盖 getItemType()
@Override
public int getItemViewType(int position) {
return mCurrentViewType;
}
我的 toggleItemViewType 方法:
public void toggleItemViewType () {
if (mCurrentViewType == LIST_ITEM){
mCurrentViewType = GRID_ITEM;
} else {
mCurrentViewType = LIST_ITEM;
}
}
我正在访问来自不同类的变量,这是不对的,但是现在,为了 onCreateViewHolder 问题,它起作用了! 如果您有更好的解决方案,那么祝您好运并与我们分享。 不要忘记将全局变量设为“静态”:)
是的,它会假设其当前数据集无效,并且需要重新布局和重新绑定所有布局。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.