美文网首页
ScrollView嵌套ListView或RecyclerVie

ScrollView嵌套ListView或RecyclerVie

作者: 小小9575 | 来源:发表于2019-05-07 15:29 被阅读0次

    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"
    

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

    image

    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也就不能滑动了。

    相关文章

      网友评论

          本文标题:ScrollView嵌套ListView或RecyclerVie

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