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