各种长见识涨姿势Android知识Android开发

《Android APP要解决的问题》之显示篇:ScrollVi

2016-10-25  本文已影响1186人  温瑜

前言

有些需求中界面里面除了listview还有其他内容需要显示,而且内容还不少,这样的话交给listview的空间就少了很多,这样就得嵌套一层scrollview来让整个界面都可以滑动,才能完整的看到listview,不至于就那么一小块地方在那里上下滑动。

然后在scroll里面嵌套listview问题就出来了,listview只显示了一行或者两行数据,这就蛋疼了,当然可以手动给listview设置一个高度,但是这显然不能适配所有手机屏幕的显示。这里记录一下解决方式。

解决一

我之前采取的方式是重新手动计算ListView高度,代码如下:

public class UIUtil {
    public static void setListViewHeightBasedOnChildren(ListView listView) {
        //获取ListView对应的Adapter
        ListAdapter listAdapter = listView.getAdapter();
        if (listAdapter == null) {
            // pre-condition
            return;
        }

        int totalHeight = 0;
        for (int i = 0, len = listAdapter.getCount(); i < len; i++) {   //listAdapter.getCount()返回数据项的数目
            View listItem = listAdapter.getView(i, null, listView);
            listItem.measure(0, 0);  //计算子项View 的宽高
            totalHeight += listItem.getMeasuredHeight();  //统计所有子项的总高度
        }

        ViewGroup.LayoutParams params = listView.getLayoutParams();
        params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
        //listView.getDividerHeight()获取子项间分隔符占用的高度
        //params.height最后得到整个ListView完整显示需要的高度
        listView.setLayoutParams(params);
    }
}


然后在用到listview的地方再调用就行了。

问题

然鹅昨天发现会在oppo,系统版本4.2.2上面会报空指针,我6.0系统没问题。具体原因没有没有探究,因为我要先解决问题,报错代码来自于这一行:

listItem.measure(0, 0);

解决二

然后我就换了另外一种方式,自定义listview,重写onMeasure方法:

 @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);
    }

这里主要是对高度进行了重绘,MeasureSpec.AT_MOST测量模式:The child can be as large as it wants up to the specified size.需要展示的子view会尽量大到它具体的大小。强行设置AT_MOST来测量ListView自适应。

别忘记重新换控件引用。

然后就是进入界面的时候,会直接定位到listview的顶部,解决:

scrollview.smoothScrollTo(0, 0);

问题

严重的性能问题,根据官方设计建议,ListView其实是禁止放在ScrollView等垂直滚动视图中的,具体说明参看Android应用性能优化系列视图篇——ListView自适应导致的严重性能问题,强行放置的结果就是ScrollView中嵌有列表的页面可能会卡出翔,文章中也给出了几点建议。但是我使用的场景是不会用大量数据的,性能再耗也不会卡/姚明笑~

解决三

但是数据量大的怎么办呢?上面引文中提到了一个自定义控件,SimulateListView或许可以满足需求,但是我木有尝试,这里做一个记录而已,以备不时之需。

这次没有代码


本文作者:paradoxie
个人主页:谢盒盒的小黑屋,不止说技术
简书地址:简书主页,专注技术类
github地址:paradoxie
转载请注明出处,蟹蟹!
-------我的梦想真的是做一条咸鱼!

上一篇下一篇

猜你喜欢

热点阅读