嵌套滑动解决之法

425 阅读2分钟

一、ScrollView/NestedScrollView中嵌套RecyclerView时滑动异常的解决方案:

1.竖向滑动的RecyclerView重写canScrollVertically()方法,水平滑动的RecyclerView重写canScrollHorizontally方法。

recyclerView.setLayoutManager(new LinearLayoutManager(this){
      @Override      
      public boolean canScrollVertically() {      
         //解决ScrollView里存在多个RecyclerView时滑动卡顿的问题         
         return false;
      }
});

2.解决数据加载不完的问题。

recyclerView.setNestedScrollingEnabled(false);

3.解决数据加载完成后, 没有停留在顶部的问题。

recyclerView.setFocusable(false);

4.若以上解决方案仍未解决,则将RecyclerView外层的ScrollView替换成NestedScrollView就可以了。

二、当ScrollView/NestedScrollView中嵌套ListView或GridView时滑动异常的解决方案:

1.ListView或GridView的内容无法全部显示(ListView和GridView现象一样)。

解决方案为自定义该控件(以GridView为例,ListView类似),使ListView或GridView高度全部显示:

public class MyGridView extends GridView {
    public MyGridView(Context context) {
        super(context);
    }

    public MyGridView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MyGridView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    /**
     * 重写该方法,使GridView 高度全部显示以适应ScrollView的效果
     */
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		//最大高度设为一个极大值,保证高度全部显示
        int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
                MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, expandSpec);
    }
}

2.若出现数据加载完页面没有停留在顶部的问题,解决方案是让控件失去焦点。

//必须在控件初始化后设置, 不能写在xml的布局文件中,否则不起作用。

gridView.setFocusable(false);














微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。

我是程序员小迷(致力于C、C++、Java、Kotlin、Android、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。

欢迎关注。助您在编程路上越走越好!