美文网首页Android 踩坑记安卓资料汇总项目
Android 解决切换Tab后RecycleView/List

Android 解决切换Tab后RecycleView/List

作者: 程序员K哥 | 来源:发表于2017-08-07 18:57 被阅读836次

未经本人授权,不得转载!否则必将维权到底

出了个 Bug,点击底部 Tab 切换 Fragment,Fragment 中的 RecycleView 自动回滚至第一个条目。正常情况应该是页面列表滚动到哪,再切换回 Tab 的时候还是在当前的滚动位置。

问题展示:

Bug复现.gif

尝试解决方案:

Debug 跟了一遍代码,发现代码里面并没有设置 RecycleView.smoothScrollToPosition() / ListView.setSelection() 这类的方法。查了很多也找不到头绪。后来无意中想到以前 ListView 抢焦点的 Bug,就尝试了一下,果不其然的解决了。

可行方案:

使用 descendantFocusability 属性解决:
API 描述如下:android:descendantFocusability
Defines the relationship between the ViewGroup and its descendants when looking for a View to take focus.
Must be one of the following constant values.


该属性是当一个为 View 获取焦点时,定义 ViewGroup 和其子控件两者之间的关系。
属性的值有三种:
beforeDescendants:ViewGroup 会优先其子类控件而获取到焦点
afterDescendants:ViewGroup 只有当其子类控件不需要获取焦点时才获取焦点
blocksDescendants:ViewGroup 会覆盖子类控件而直接获得焦点

通常我们用到的是第三种,即在Item布局的根布局加上android:descendantFocusability=”blocksDescendants”的属性就解决了

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/content_bg"
    // 只需要加上这个属性,就解决了这个 Bug !!!
    android:descendantFocusability="blocksDescendants"
    android:orientation="vertical">

    <!-- tab-->
    <cn.keithxiaoy.PagerSlidingTabStrip
        android:id="@+id/keithxiaoySlidingTabStrip"
        android:layout_marginTop="?attr/actionBarSize"
        android:layout_width="match_parent"
        android:layout_height="44dp"
        android:layout_gravity="top"
        android:background="@android:color/white"
        android:textColor="@color/font_gray_dark"
        android:textSize="15sp"
        app:pstsIndicatorColor="@color/font_blue_light"
        app:pstsIndicatorHeight="2dp"
        app:pstsIndicatorMaxWidth="15dp"
        app:pstsShouldExpand="true"
        app:pstsTabPaddingLeftRight="10dp"
        app:pstsTextActiveColor="@color/font_blue"
        app:pstsUnderlineColor="#cccccc"
        app:pstsTextActiveSize="@dimen/font_size_large2"
        app:pstsUnderlineHeight="1px" />

    <!-- 加载的view-->
    <cn.keithxiaoy.LoadingDataTipsView
        android:id="@+id/keithxiaoyTipView"
        android:layout_below="@+id/keithxiaoySlidingTabStrip"
        android:visibility="gone"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </cn.keithxiaoy.LoadingDataTipsView>

    <!-- viewpager-->
    <cn.keithxiaoy.ViewPager
        android:id="@+id/keithxiaoyViewPager"
        android:layout_below="@+id/pagerSlidingTabStrip"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</RelativeLayout>

解决后的效果展示:

Bug解决.gif

这 Bug 不常见,网上资料也不多,所以分享一下。希望能帮助到大家~


欢迎关注我的微信公众号与我交流,希望与大家共同成长,未来是属于我们的!

相关文章

网友评论

  • Mrxxy:昨天才通过这个方法解决了RecyclerView嵌套的问题
    程序员K哥:@Shayne_xxy :joy:开发经验很重要啊,以后遇到这个问题咱们就有印象了。秒解这个bug
    Mrxxy:@keithxiaoy 我用了一个开源库,然后有问题就提了一个issue,作者没有回我,然后路人告诉我的。当时的问题是header+横向RecyclerView加纵向RRecyclerView,每次点击任意item后再返回,都会默认滑倒横向RecyclerView的位置
    程序员K哥:@Shayne_xxy 厉害了,思路是怎么样的?或者你是搜什么关键字得到结果的?

本文标题:Android 解决切换Tab后RecycleView/List

本文链接:https://www.haomeiwen.com/subject/orbalxtx.html