zoukankan      html  css  js  c++  java
  • 解决在ScrollView中套用ListView显示不正常

    最近在设计Android程序时,因为需要在ScrollView中添加一个ListView列表来显示一些信息。刚开始并没有想太多,但添加进去后才发现ListView不论怎样定义都只能显示一行,显示效果很不正常。

    后来在网上查了一下才知道,原因是ScrollView和ListView默认都带有滚动条,所以一起使用就会引起冲突。但因为程序中我必须要添加一个ListView,且不想取消外层的ScrollView(想保证用户在程序页面能够上下滑动来浏览更多内容),经过查询找到了解决此问题的方法。

    下面记录与分享一下,个人理解该方法的思路大概是这样子的:
    根据ListView的子项目来ListView的高度,然后再计算总的ListView高度,然后在setLayoutParams给外面容器。
    原代码请参考:

    假设的ListView生成代码:

    //生成ListView并显示
    ListView list = (ListView) findViewById(R.id.ListView01);
    //生成动态数组,加入数据
    ArrayList<HashMap<String, Object>> listItem = new ArrayList<HashMap<String, Object>>();
    for(int i=0;i<10;i++)
    {
    HashMap<String, Object> map = new HashMap<String, Object>();
    map.put("ItemImage", R.drawable.list_arrow);//图像资源的ID
    map.put("ItemTitle", "Level "+i);
    map.put("ItemText", "点击查看该用户详细资料!");
    listItem.add(map);
    }
    //生成适配器的Item和动态数组对应的元素
    SimpleAdapter listItemAdapter = new SimpleAdapter(this,listItem,// 数据源
    R.layout.list_items,//ListItem的XML实现
    //动态数组与ImageItem对应的子项
    new String[] {"ItemImage","ItemTitle", "ItemText"},
    //ImageItem的XML文件里面的一个ImageView,两个TextView ID
    new int[] {R.id.ItemImage,R.id.ItemTitle,R.id.ItemText}
    );
    //添加并且显示
    list.setAdapter(listItemAdapter);
    
    //重要:定义ListView高度,否则在ScrollView中显示不正常。
    //调用下面定义的方法。
    setListViewHeightBasedOnChildren(list);
    }
    

      

    以下为计算ListView高度的方法:

    //定义ListView高度的方法,重要:否则在ScrollView中显示不正常。
    public void setListViewHeightBasedOnChildren(ListView list) {
    ListAdapter listAdapter = list.getAdapter();
    if (listAdapter == null) {
    return;
    }
    int totalHeight = 0;
    for (int i = 0; i < listAdapter.getCount(); i++) {
    View listItem = listAdapter.getView(i, null, list);
    listItem.measure(0, 0);
    totalHeight += listItem.getMeasuredHeight();
    }
    ViewGroup.LayoutParams params = list.getLayoutParams();
    params.height = totalHeight
    + (list.getDividerHeight() * (listAdapter.getCount() - 1));
    ((MarginLayoutParams) params).setMargins(10, 10, 10, 10);
    list.setLayoutParams(params);
    }
    

    ScrollView中套用ListView兼容实例演示:下载实例

    -全文完-

  • 相关阅读:
    vue-fullcalendar插件
    iframe 父框架调用子框架的函数
    关于调试的一点感想
    hdfs 删除和新增节点
    hadoop yarn 实战错误汇总
    Ganglia 安装 No package 'ck' found
    storm on yarn(CDH5) 部署笔记
    spark on yarn 安装笔记
    storm on yarn安装时 提交到yarn失败 failed
    yarn storm spark
  • 原文地址:https://www.cnblogs.com/colinliu/p/scrollview-listview.html
Copyright © 2011-2022 走看看