RecyclerView实现List布局到Grid布局切换

字数 459阅读 3568

要实现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

推荐阅读更多精彩内容