强制RecyclerView调用onCreateViewHolder [英] Force RecyclerView to call onCreateViewHolder
问题描述
我有一个RecyclerView
,可以将项目显示为列表,小网格或大网格,并且可以在运行时进行更改.根据用户选择的样式,我在onCreateViewHolder
中填充不同的布局.
我还使用layoutManger.setSpanSizeLookUp()
在样式之间进行切换.我的代码看起来像这样
I have a RecyclerView
that can show items as list, small grids or large grid and this can be change at runtime. Depending on what style user chooses i inflate different layout in onCreateViewHolder
.
I also use layoutManger.setSpanSizeLookUp()
to switch between styles. My code looks like this
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?
得到类似的东西
任何不使用多个适配器的解决方案就足够了!
The problem is to force onCreateViewHolder
to be called I'm creating a new object every time user changes the style. Is there any other way?! to force onBindViewHolder()
to be recalled. I simply use adapter.notifyDataSetChanged()
How can i get something similar for onCreateViewHolder?
Any solution that doesn't uses multiple adapters is good enough!
推荐答案
您需要做的是:
- 修改您的
Adapter
:
- 指定
Adapter
可以充气的两种Views
类型:
- Specify two types of
Views
that yourAdapter
can inflate:
private static final int LARGE_GRID_ITEM = -1;
private static final int SMALL_GRID_ITEM = -2;
-
创建一个可以存储当前类型
mCurrentType
Use your
Adapter's
getItemViewType
. For example like this:@Override public int getItemViewType (int position) { return mCurrentType; }
- 在
createViewHolder
中,使用viewType
决定需要创建哪种类型的ViewHolder
. - In your
createViewHolder
use theviewType
to decide what type ofViewHolder
you need to create.
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(); }
这篇关于强制RecyclerView调用onCreateViewHolder的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
- 在