在使用RecyclerView时,notifydatasetchanged调用onCreateViewHolder

时间:2015-02-18 07:13:30

标签: android android-adapter android-recyclerview notifydatasetchanged

我想使用切换来在两个不同的视图之间切换,但使用相同的RecyclerView。基本上,一旦你切换,我希望RecyclerView适配器调用onCreateViewHolder(),但这次它将使用不同的布局项文件。

notifydatasetchanged()会导致适配器重建吗?或者还有另一种方式吗?

6 个答案:

答案 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”:)