我想使用切换来在两个不同的视图之间切换,但使用相同的RecyclerView
。基本上,一旦你切换,我希望RecyclerView
适配器调用onCreateViewHolder()
,但这次它将使用不同的布局项文件。
notifydatasetchanged()
会导致适配器重建吗?或者还有另一种方式吗?
答案 0 :(得分:23)
我需要在View
RecyclerView
Adapter
上有两种类型,一种用于“常规”模式,另一种用于多选模式。
因此,您可以覆盖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);
}
...
}
由于在ViewType
中返回不同的ActionMode
,因此适配器将被强制丢弃所有已创建的视图,并再次重新创建所有视图。
答案 1 :(得分:9)
notifyDataSetChanged()
的情况下, onBindViewHolder()
调用RecyclerView
答案 2 :(得分:2)
要删除并更新RecyclerView
中的布局,您可以致电
mRecyclerView.removeView(view);
OR
mRecyclerView.removeViewAt(position);
删除数据集中的对象后
答案 3 :(得分:2)
最佳解决方案
为什么? 因为 ITEM_VIEW_TYPE 用于在 recyclerview 中使用完全不同的视图,例如 contentView 和 bannerAdView
如果你想刷新 recyclerview 项目和 onCreateView() 也被称为网格和列表? 这是如何做到这一点。
科特林
abstract class
Java
fun refreshRecyclerView(recyclerView:RecyclerView){
val adapterRef=recyclerView.adapter
recyclerView.adapter=null
recyclerView.adapter=adapterRef
}
答案 4 :(得分:0)
是的,它会假设其当前数据集无效,需要重新布局并重新绑定所有布局。
答案 5 :(得分:0)
我在此问题上花费了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问题,它可以正常工作! 如果您有更好的解决方案,那么祝您好运并与我们分享。 不要忘记将全局变量设置为“ static”:)