剑客
关注科技互联网

RecyclerView根据横竖屏显示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);

}

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址