• 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);  
  • 相关阅读:
    使用Azure Rest API获得Access Token介绍
    Azure Service Fabric应用程序日志记录与展现
    Azure Web App创建Python应用
    AzureWeb App如何做私有仓储的部署
    Python web在IIS上发布方法和原理
    [转载]DriverStore文件夹特别大,能删除吗?
    Azure Web APP中Local Git 如何部署分支
    Azure Web 应用如何修改 IIS 配置
    文件上传绕过
    windows下通过配置服务器安全策略指定IP地址远程访问服务器的设置方法
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/5806277.html
Copyright © 2020-2023  润新知