zoukankan      html  css  js  c++  java
  • (六十七)ScrollView与ListView合用(正确计算Listview的高度)的问题解决

     
    最近做项目中用到ScrollView和ListView一起使用的问题,显示的时候ListView不能完全正确的显示,查了好多资料终于成功解决:

    首先,ListView不能直接用,要自定义一个ListView,然后重写onMeasure()方法,防止有时计算高度时候计算错误:

    复制代码 代码如下:

    @Override
    protected 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);

    }

     注意事项: 但是这个方法有个两个细节需要注意:
            一是Adapter中getView方法返回的View的必须由LinearLayout组成,因为只有LinearLayout才有measure()方法,如果使用其他的布局如RelativeLayout,在调用listItem.measure(0, 0);时就会抛异常,因为除LinearLayout外的其他布局的这个方法就是直接抛异常的,没理由…。我最初使用的就是这个方法,但是因为子控件的顶层布局是RelativeLayout,所以一直报错,不得不放弃这个方法。
            二是需要手动把ScrollView滚动至最顶端,因为使用这个方法的话,默认在ScrollView顶端的项是ListView,具体原因不了解,求大神解答…可以在Activity中设置:

      • sv = (ScrollView) findViewById(R.id.act_solution_1_sv);
      • sv.smoothScrollTo(0, 0);

    第三步:listview添加适配器后设置高度即可:

    复制代码 代码如下:

    listView.setAdapter(adapter);
    new ListViewUtil().setListViewHeightBasedOnChildren(listView);  
     
  • 相关阅读:
    【数据结构】线性表&&顺序表详解和代码实例
    【智能算法】超详细的遗传算法(Genetic Algorithm)解析和TSP求解代码详解
    【智能算法】用模拟退火(SA, Simulated Annealing)算法解决旅行商问题 (TSP, Traveling Salesman Problem)
    【智能算法】迭代局部搜索(Iterated Local Search, ILS)详解
    10. js时间格式转换
    2. 解决svn working copy locked问题
    1. easyui tree 初始化的两种方式
    10. js截取最后一个斜杠后面的字符串
    2. apache整合tomcat部署集群
    1. apache如何启动
  • 原文地址:https://www.cnblogs.com/fuyanan/p/4533101.html
Copyright © 2011-2022 走看看