RecyclerView根据横竖屏显示list和grid

我们知道RecyclerView可以很容易地显示list和grid,下面我们这样一个需求:在竖屏的时候显示list,在横屏的时候显示grid;并且还要记住上次浏览的位置。下面来实现一下这个功能吧。

首先创建两个LayoutManager分别对应横竖屏使用

1
2
linearLayoutManager = new LinearLayoutManager(context);
gridLayoutManager = new GridLayoutManager(context, 2);

在Manifest文件里对应的Activity下添加如下代码,这样在横竖屏切换的时候对应的Activity就不会被重新创建了。

1
android:configChanges="orientation|keyboardHidden|screenSize"

重写包含RecyclerView的容器的onConfigurationChanged方法,这个容器可以是Activity/Fragment或者一个ViewGroup。但是需要记住的是只需要重写最内一层容器的onConfigurationChanged方法就可以了。如一个Activity包含了一个Viewgroup, 而这个Viewgroup包含了RecyclerView, 这时只要重写Viewgroup的onConfigurationChanged。

但是如何知道目前RecyclerView浏览的位置呢?ReCyclerView好像没有getPosition()之类的方法。其实当前的position信息是保存在LayoutManager里面,我们通过下面的代码就可以得到当前最上面可见Item的position:

1
gridLayoutManager.findFirstVisibleItemPosition

得到了position,通过scrollToPosition方法就可以让RecyclerView直接从这个position来显示内容了。完整的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
int position = 0;
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
position = linearLayoutManager.findFirstVisibleItemPosition();
listView.setLayoutManager(gridLayoutManager);
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
position = gridLayoutManager.findFirstVisibleItemPosition();
listView.setLayoutManager(linearLayoutManager);
}

listView.getLayoutManager().scrollToPosition(position);

}