ScrollView嵌套ListView或RecyclerView出现问题解决方法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_40998254/article/details/80988749

ScrollView嵌套ListView,ListView显示不全的问题是一个老生常谈的问题,不建议嵌套有时候又身不由己呀可怜,对于有些页面多布局和加header都不好用但是使用LinearLayout又不方便的时候,怎么看都是嵌套起来最简单,我们这些开发人员又能怎么办呢?那就怎么实现容易怎么来吧。

解决ScrollView和ListView滑动冲突和只显示一行

重新写一个View继承ListView,重写onMeasure方法,如下

public class ListViewForScrollView extends ListView {
    public ListViewForScrollView(Context context) {
        super(context);
    }
    public ListViewForScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    public ListViewForScrollView(Context context, AttributeSet attrs,
        int defStyle) {
        super(context, attrs, defStyle);
    }
    @Override
    /**
     * 重写该方法,达到使ListView适应ScrollView的效果
     */
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
        MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, expandSpec);
    }
}

这样基本上就解决冲突了,但是由于ListView高度经过就算,ListView完整加载完后又添加进ScrollView中,所以关于ListView复用item布局的优化就废了,所以当ListView的item很少的时候可以,很多的时候就请另辟蹊径吧!

解决ScrollView和RecyclerView滑动冲突和只显示一行

RecyclerView这个View不像是ListView,它既需要一个”适配器“Adapter又需要一个”布局管理者“LayoutManager,像GridLayoutManager、LinearLayoutManager我们就经常会用到。话不多说,赶紧说怎么解决,在Recycler外面嵌套一层布局,例如:

<RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                >

                <android.support.v7.widget.RecyclerView
                    android:id="@+id/rv_similar"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:background="@color/white">
                </android.support.v7.widget.RecyclerView>

            </RelativeLayout>

很多人肯定和我一样惊呆了,what the fuck?然后一万匹...

其实是外面嵌套的布局帮你计算高度了,也有人说需要在外面嵌套布局加上这行代码

android:descendantFocusability="blocksDescendants"

你不加发现也可以呀,怎么回事,这行代码是干什么的,往下看


beforeDescendants:viewgroup会优先其子类控件而获取到焦点

afterDescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点

blocksDescendants:viewgroup会覆盖子类控件而直接获得焦点

我猜测可能这个人想解决滑动冲突,至于用不用加读者自己判断吧,我相信很多人会加,加了有没有坏处吗!(让我想起了一句话,吃保健品即使没有好处又没有坏处吗)然后你会发现滑动冲突还在的,那具体怎么解决滑动冲突呢?

创建LayoutManager的时候想解决水平滑动冲突就重写canScrollHorizontally方法想解决竖直滑动冲突就重写canScrollVertically方法如下

GridLayoutManager similarLayoutManager = new GridLayoutManager(this, 4){
            @Override
            public boolean canScrollVertically() {
                return false;
            }

            @Override
            public boolean canScrollHorizontally() {
                return false;
            }
        };
别的LayoutManager也是一样,return false了RecyclerView也就不能滑动了。

猜你喜欢

转载自blog.csdn.net/weixin_40998254/article/details/80988749