RecyclerView根据横竖屏显示list和grid

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

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

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

linearLayoutManager = new LinearLayoutManager(context);

gridLayoutManager = new GridLayoutManager(context, 2);

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

android:configChanges="orientation|keyboardHidden|screenSize"

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

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

gridLayoutManager.findFirstVisibleItemPosition

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

@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);

}

未登录用户
全部评论0
到底啦