簡體   English   中英

強制RecyclerView調用onCreateViewHolder

[英]Force RecyclerView to call onCreateViewHolder

我有一個RecyclerView ,可以顯示項目列表,小網格或大網格,這可以在運行時更改。 根據用戶選擇的樣式,我在onCreateViewHolderonCreateViewHolder不同的布局。

我還使用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?

任何不使用多個適配器的解決方案都足夠好了!

你需要做的是:

  1. 修改你的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;
}
  1. 修改您發布的代碼:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM