簡體   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