gpt4 book ai didi

android - 强制 RecyclerView 调用 onCreateViewHolder

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:24:57 27 4
gpt4 key购买 nike

我有一个 RecyclerView 可以将项目显示为列表、小网格或大网格,这可以在运行时更改。根据用户选择的样式,我在 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 获得类似的东西?

任何不使用多个适配器的解决方案就足够了!

最佳答案

你需要做的是:

  1. 修改您的适配器:

  • 指定您的适配器可以扩展的两种类型的 View :

private static final int LARGE_GRID_ITEM = -1;
private static final int SMALL_GRID_ITEM = -2;
  • 创建一个可以存储当前类型的字段mCurrentType

  • 使用您的适配器 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();
}

关于android - 强制 RecyclerView 调用 onCreateViewHolder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33340665/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com