[英]Force RecyclerView to call onCreateViewHolder
我有一個RecyclerView
,可以顯示項目列表,小網格或大網格,這可以在運行時更改。 根據用戶選擇的樣式,我在onCreateViewHolder
中onCreateViewHolder
不同的布局。
我還使用layoutManger.setSpanSizeLookUp()
在樣式之間切換。 我的代碼看起來像這樣
layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
if(showType == ProductAdapter.SHOW_TYPE_SMALL_GRID)
return 1;
else
return columnCount; //show one item per row
}
});
@Override
public void onClick(View v) {
if(showType == ProductAdapter.SHOW_TYPE_SMALL_GRID)
showType = ProductAdapter.SHOW_TYPE_LARGE_GRID;
else
showType = ProductAdapter.SHOW_TYPE_SMALL_GRID;
int firstVisibleItem = layoutManager.findFirstVisibleItemPosition();
adapter = new ProductAdapter(getActivity(), productList, showType);
recyclerView.setAdapter(adapter);
layoutManager.scrollToPosition(firstVisibleItem);
}
問題是強制onCreateViewHolder
被調用我每次用戶更改樣式時都會創建一個新對象。 還有其他辦法嗎?! 強制onBindViewHolder()
被召回。 我只是使用adapter.notifyDataSetChanged()
如何為onCreateViewHolder?
獲得類似的東西onCreateViewHolder?
任何不使用多個適配器的解決方案都足夠好了!
你需要做的是:
Adapter
: Adapter
可以膨脹的兩種類型的Views
: private static final int LARGE_GRID_ITEM = -1;
private static final int SMALL_GRID_ITEM = -2;
創建一個可以存儲當前類型mCurrentType
使用Adapter's
getItemViewType
。 例如這樣:
@Override
public int getItemViewType (int position) {
return mCurrentType;
}
createViewHolder
使用viewType
來決定需要創建哪種類型的ViewHolder
。 public final RecyclerView.ViewHolder createViewHolder (ViewGroup parent, int viewType){
if (viewType == LARGE_GRID_ITEM) {
//return large grid view holder
} else {
//return small grid view holder
}
}
public void toggleItemViewType () {
if (mCurrentType == LARGE_GRID_ITEM){
mCurrentType = SMALL_GRID_ITEM;
} else {
mCurrentType = LARGE_GRID_ITEM;
}
}
public boolean displaysLargeGrid(){
return mCurrentType == LARGE_GRID_ITEM;
}
layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
if (adapter.displaysLargeGrid()) {
return 1;
} else {
return columnCount; //show one item per row
}
}
});
@Override
public void onClick(View v) {
adapter.toggleItemViewType();
adapter.notifyDataSetChanged();
}
它不是最佳選擇,但最好創建一個新的Adapter
,它將調用onCreateViewHolder()
。 這樣,您可以通過非常微小的性能問題來避免麻煩。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.