动态更改 GridLayoutManager 的列数
Dynamically change the number of columns of a GridLayoutManager
我实际上在我的应用程序中使用了一个包含两列的 GridLayoutManager,我希望根据所使用的视图类型使用一列。
这是我片段的方法 "onCreateView()" 中的代码:
// Recycler view for users
usersList = (RecyclerView) mView.findViewById(R.id.usersList);
// Layout manager (grid of users
layoutManager = new GridLayoutManager(mContext, 2);
usersList.setLayoutManager(layoutManager);
// ArrayList of users
users = new ArrayList<User>();
// Set the adapter for the list of users
mHomeListAdapter = new HomeListAdapter(getActivity(), users);
usersList.setAdapter(mHomeListAdapter);
然后,在我的适配器中,我有这样的代码:
@Override
public int getItemViewType(int position) {
if (position == 5) {
return TYPE_PREMIUM;
} else {
return TYPE_ITEM;
}
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == TYPE_PREMIUM) {
View view = mInflater.inflate(R.layout.become_premium, parent, false);
HeaderViewHolder holder = new HeaderViewHolder(view);
return holder;
} else {
View view = mInflater.inflate(R.layout.posts_item, parent, false);
ViewHolderPosts holder = new ViewHolderPosts(view);
return holder;
}
}
因此,当使用视图 "TYPE_PREMIUM" 时,我想显示一个按钮(因此在一列中)并为其他结果显示一个普通的网格视图(两列)。
可以这样做吗?
谢谢!
如果我理解你的问题,你想让高级类型的视图跨越 2 列而不是 1 列?这可以通过设置自定义 SpanSizeLookup with setSpanSizeLookup(SpanSizeLookup).
mGridLayoutManager = new GridLayoutManager(mContext, 2);
mGridLayoutManager.setSpanSizeLookup(onSpanSizeLookup);
/**
* Helper class to set span size for grid items based on orientation and device type
*/
GridLayoutManager.SpanSizeLookup onSpanSizeLookup = new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
return mHomeListAdapter.getItemViewType(position) == TYPE_PREMIUM ? 2 : 1;
}
};
我使用复选框来更改布局管理器列。
您应该使用它来更改 GridLayoutManager 列。
这是代码:
checkBox = findViewById(R.id.change_manager);
checkBox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (checkBox.isChecked()) {
layoutManager.setSpanCount(2);
isLayoutChange = true;
} else {
isLayoutChange = false;
layoutManager.setSpanCount(3);
}
}
});
和 boolean 用于检查 layoutManager 在 onResume() , onRestart() 和 onPause() 方法。像这样使用它:
if (isLayoutChange) {
layoutManager.setSpanCount(2);
} else {
layoutManager.setSpanCount(3);
}
我实际上在我的应用程序中使用了一个包含两列的 GridLayoutManager,我希望根据所使用的视图类型使用一列。
这是我片段的方法 "onCreateView()" 中的代码:
// Recycler view for users
usersList = (RecyclerView) mView.findViewById(R.id.usersList);
// Layout manager (grid of users
layoutManager = new GridLayoutManager(mContext, 2);
usersList.setLayoutManager(layoutManager);
// ArrayList of users
users = new ArrayList<User>();
// Set the adapter for the list of users
mHomeListAdapter = new HomeListAdapter(getActivity(), users);
usersList.setAdapter(mHomeListAdapter);
然后,在我的适配器中,我有这样的代码:
@Override
public int getItemViewType(int position) {
if (position == 5) {
return TYPE_PREMIUM;
} else {
return TYPE_ITEM;
}
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == TYPE_PREMIUM) {
View view = mInflater.inflate(R.layout.become_premium, parent, false);
HeaderViewHolder holder = new HeaderViewHolder(view);
return holder;
} else {
View view = mInflater.inflate(R.layout.posts_item, parent, false);
ViewHolderPosts holder = new ViewHolderPosts(view);
return holder;
}
}
因此,当使用视图 "TYPE_PREMIUM" 时,我想显示一个按钮(因此在一列中)并为其他结果显示一个普通的网格视图(两列)。
可以这样做吗?
谢谢!
如果我理解你的问题,你想让高级类型的视图跨越 2 列而不是 1 列?这可以通过设置自定义 SpanSizeLookup with setSpanSizeLookup(SpanSizeLookup).
mGridLayoutManager = new GridLayoutManager(mContext, 2);
mGridLayoutManager.setSpanSizeLookup(onSpanSizeLookup);
/**
* Helper class to set span size for grid items based on orientation and device type
*/
GridLayoutManager.SpanSizeLookup onSpanSizeLookup = new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
return mHomeListAdapter.getItemViewType(position) == TYPE_PREMIUM ? 2 : 1;
}
};
我使用复选框来更改布局管理器列。 您应该使用它来更改 GridLayoutManager 列。 这是代码:
checkBox = findViewById(R.id.change_manager);
checkBox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (checkBox.isChecked()) {
layoutManager.setSpanCount(2);
isLayoutChange = true;
} else {
isLayoutChange = false;
layoutManager.setSpanCount(3);
}
}
});
和 boolean 用于检查 layoutManager 在 onResume() , onRestart() 和 onPause() 方法。像这样使用它:
if (isLayoutChange) {
layoutManager.setSpanCount(2);
} else {
layoutManager.setSpanCount(3);
}