要实现RecyclerView实现List布局到Grid布局切换,首先我们要先创建一个工程并新建包含RecyclerView的Activity。数据绑定等操作此处不多介绍,本文主要介绍通过RecyclerView的LayoutManager来轻松的实现list列表布局到Grid布局的切换。
创建好Activity并协会相应的Adapter。下面我们以google官方提供的样例代码来介绍切换过程的实现。
样例参考
样例中,RecyclerView定义在是在Fragment中。而关键的切换动作则又下面这个函数完成
public void setRecyclerViewLayoutManager(LayoutManagerType layoutManagerType) {
int scrollPosition = 0;
// If a layout manager has already been set, get current scroll position.
if (mRecyclerView.getLayoutManager() != null) {
scrollPosition = ((LinearLayoutManager) mRecyclerView.getLayoutManager())
.findFirstCompletelyVisibleItemPosition();
// 获取当前第一个可见Item的position
}
switch (layoutManagerType) {
case GRID_LAYOUT_MANAGER:
mLayoutManager = new GridLayoutManager(getActivity(), SPAN_COUNT);
mCurrentLayoutManagerType = LayoutManagerType.GRID_LAYOUT_MANAGER;
break;
case LINEAR_LAYOUT_MANAGER:
mLayoutManager = new LinearLayoutManager(getActivity());
mCurrentLayoutManagerType = LayoutManagerType.LINEAR_LAYOUT_MANAGER;
break;
default:
mLayoutManager = new LinearLayoutManager(getActivity());
mCurrentLayoutManagerType = LayoutManagerType.LINEAR_LAYOUT_MANAGER;
}
mRecyclerView.setLayoutManager(mLayoutManager);
mRecyclerView.scrollToPosition(scrollPosition);
}
其中,layoutManagerType用来指定是使用LINEAR_LAYOUT还是使用GRID_LAYOUT。切换布局前,首先通过现有LayoutManager来获取当前第一个可见Item的信息。然后对RecyclerView重新设置新的LayoutManager,设置以后,通过调用RecyclerView的scrollToPosition定位到切换之前的第一个可见Item的位置。
另外,官方的样例中还向我们展示了通过onSaveInstanceState来还原之前选择的布局类型,当我们的Activity退出或意外退出的时候,系统会通过onSaveInstanceState来通知做数据保存。
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
// Save currently selected layout manager.
savedInstanceState.putSerializable(KEY_LAYOUT_MANAGER, mCurrentLayoutManagerType);
super.onSaveInstanceState(savedInstanceState);
}
在下一次进来的时候,如果Activity或Fragment退出前有保存数据那么在Activity的OnCreate中或者Fragment的onCreateView中,我们通过savedInstanceState参数来还原之前保存的状态数据。
if (savedInstanceState != null) {
// Restore saved layout manager type.
mCurrentLayoutManagerType = (LayoutManagerType) savedInstanceState
.getSerializable(KEY_LAYOUT_MANAGER);
}
官方的样例中,通过两个按钮来切换布局。在官方的样例中,使用的LayoutManager都是系统提供的默认布局管理器,同样的,我们也可以自定义LayoutManager并通过类似的方式来实现自定义的LayoutManager之间的相互切换。
参考官方样例:https://github.com/googlesamples/android-RecyclerView