解决ScrollView嵌套listview动态设置高度时,item高度不一样时,最后一个item显示不完全

作者: wxyass 分类: Android 发布时间: 2017-07-25 14:56

转载: http://blog.csdn.net/niu101025/article/details/52882794

在ScrollView嵌套listview动态设置高度时,item高度不一样时,最后一个item显示不完全。对于这个问题,有两种解决办法。

1:重新listview的onmeasure方法,这个是最简单的方法, 但是我在测试中发现,这个方法在加载数据时会阻塞ui,造成了很不好的用户体验。所以果断抛弃这个方法。

2:在适配器更新后,根据适配器计算listview的高度,然后动态的设置高度。这个在数据量不是太大的时候,性能还是可以接受的。网上有很多计算高度的方法,如下;

public class Utility { 
    public static void setListViewHeightBasedOnChildren(ListView listView) { 
        ListAdapter listAdapter = listView.getAdapter();  
        if (listAdapter == null) { 
            // pre-condition 
            return; 
        } 

        int totalHeight = 0; 
        for (int i = 0; i < listAdapter.getCount(); i++) { 
            View listItem = listAdapter.getView(i, null, listView); 
            listItem.measure(0, 0); 
            totalHeight += listItem.getMeasuredHeight(); 
        } 

        ViewGroup.LayoutParams params = listView.getLayoutParams(); 
        params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1)); 
        listView.setLayoutParams(params); 
    } 
}   

但是通过测试发现,这个页面在item的高度确定的时候好使,但是item的高度不确定的时候,会导致最后一个item不能完全显示。我在网上找了很多方法都不能解决这个问题。最后,通过改写了一下上述方法,终于解决了这个问题,亲测可以使用。代码如下:

public static void setListViewHeight(ListView listView) {
    ListAdapter listAdapter = listView.getAdapter();
    ViewGroup.LayoutParams params = listView.getLayoutParams();
    if (listAdapter == null) {
        // pre-condition
        return;
    }
    int totalHeight = 0;
    View view;
    for (int i = 0; i < listAdapter.getCount(); i++) {
        view = listAdapter.getView(i, null, listView);
        //宽度为屏幕宽度
        int i1 = View.MeasureSpec.makeMeasureSpec(getScreenWidth(MyApplication.getContext()),View.MeasureSpec.EXACTLY);

        //根据屏幕宽度计算高度
        int i2 = View.MeasureSpec.makeMeasureSpec(i1, View.MeasureSpec.UNSPECIFIED);
        view.measure(i1, i2);
        totalHeight += view.getMeasuredHeight();
    }
    params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
    listView.setLayoutParams(params);
}

public static int getScreenWidth(Context context){  
    WindowManager manager = (WindowManager) context  
            .getSystemService(Context.WINDOW_SERVICE);  
    Display display = manager.getDefaultDisplay();  
    return display.getWidth();  
}

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

发表评论

邮箱地址不会被公开。 必填项已用*标注