要實現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