• Android ListView高度自适应和ScrollView冲突解决


    在ScrollView中嵌套使用ListView,ListView只会显示一行到两行的数据。起初我以为是样式的问题,一直在对XML文件的样式进行尝试性设置,但始终得不到想要的效果。后来在网上查了查,ScrollView和ListView两个View都有滚动的效果,在嵌套使用时起了冲突,一般不建议两者套用。

    下面说说具体解决方案。方案的主要思路就是根据ListView子项重置其高度。

    首先,ListView不能直接用,要自定义一个,然后重写onMeasure()方法:

    import android.content.Context;
    import android.util.AttributeSet;
    import android.widget.ListView;
    
    public class MyListView extends ListView {
    
        public MyListView(Context context) {
        super(context);
        }
        
        public MyListView(Context context, AttributeSet attrs) {
        super(context, attrs);
        }
        
        public MyListView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        }
        
        @Override
        public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
                    MeasureSpec.AT_MOST);
            super.onMeasure(widthMeasureSpec, expandSpec);
        }
    
    }

    第二步:写个计算listView每个Item的方法:

    public void setListViewHeightBasedOnChildren(ListView listView) {
    
      // 获取ListView对应的Adapter
    
      ListAdapter listAdapter = listView.getAdapter();
    
      if (listAdapter == null) {
    
       return;
    
      }
    
      int totalHeight = 0;
    
      for (int i = 0; i < listAdapter.getCount(); 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的Adapter后调用此方法便可。

    但是要注意的是,子ListView的每个Item必须是LinearLayout,不能是其他的,因为其他的Layout(如RelativeLayout)没有重写onMeasure(),所以会在onMeasure()时抛出异常。

    1 listView.setAdapter(adapter);  
    2 setListViewHeightBasedOnChildren(listView);  
  • 相关阅读:
    CodeForces
    网络流
    poj 2185
    树的分治学习
    数位DP
    URAL 1969. Hong Kong Tram
    hdu 4759 Poker Shuffle
    hdu3712 Detector Placement
    分块思想
    莫比乌斯反演
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/5806277.html
Copyright © 2020-2023  润新知