ScrollView嵌套ListView的两个常见问题

问题一描述:

       最近开发的一个项目中,需要在Scrollview里面嵌套一个ListView,俗话说,一山不容二虎。两个都有滑动性质的控件放到一起不出现点什么状况就不太正常了。果然,因为我的布局里面大致是——外面一个ScrollView,里面是一层垂直的LinearLay,依次是一个LinearLayout和一个ListView;这是我想要的结果,可啪啪啪程序运行起来了,但是来到这个界面,想象中在ListView上面的LinearLay布局不见了,其实是被推上去了,推到了手机屏幕之外,ListView顶了上去,需要手动往下滑才能看到。这是我要说的常见的问题之一。

原因:

1、在Activity计算窗口高度时,在ListView还没有填充数据时就已经完成了,而ScrollView嵌套的ListView还没有指定高度,所以ScrollView就会按照layout中定义的默认高度计 算;

2、ListView获取了焦点;

如何解决这个问题?(总结前辈的成果,亲测有用,推荐第二种方法,第一种治标不治本的感觉)

方法一: ScrollView.smoothScrollTo(0,0); //这个方法需要在listview数据加载完成之后再调用

方法二:ListView.setFocusable(false); //不让listview获取焦点

                       在ListView的父布局中添加获取焦点的代码,android:focusableInTouchMode="true"  ;  android:focusable="true;


问题二描述:

在ScrollView里面嵌套ListView出现的一种更常见的问题是,ListView的item显示不全,只能看到一项

原因:

ScrollView无法正确测量到recyclerview的高度

解决方法:

写一个类继承自ListView,重新编写获取ListView高度的方法,代码如下:

public static void setListViewHeightBasedOnChildren(ListView listView) {
    //获得adapter
        MyAdapter adapter = (MyAdapter) listView.getAdapter();
        if (adapter == null) {
            return;
        }


        int totalHeight = 0;
        for (int i = 0; i < adapter.getCount(); i++) {
            View listItem = adapter.getView(i, null, listView);
            listItem.measure(0, 0);
            //计算总高度
            totalHeight += listItem.getMeasuredHeight();
        }


        ViewGroup.LayoutParams params = listView.getLayoutParams();
        //计算分割线高度
        params.height = totalHeight + (listView.getDividerHeight() * (adapter.getCount() - 1));
        //给listview设置高度
        listView.setLayoutParams(params);
    }

(附:如果ScrollView里面嵌套Recyclerview则不会出现问题二,但是毕竟两个都是可以滑动的,如果不作任何处理会有一定的卡顿滑动的时候,这个问题可以这么处理:

重写LayoutManager的这个方法:

public void setScrollEnabled(boolean scrollEnabled) {
        isScrollEnabled = scrollEnabled;
    }


总结:以上为个人总结的知识,如果有错误,请指正,欢迎任何的建议或知识分享!



猜你喜欢

转载自blog.csdn.net/dennyzhang2/article/details/79003374