繁体   English   中英

使用 RecyclerView 时,notifydatasetchanged 是否调用 onCreateViewHolder

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM