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兼容实例演示:下载实例

    -全文完-

  • 相关阅读:
    2016 Al-Baath University Training Camp Contest-1 I
    2016 Al-Baath University Training Camp Contest-1 H
    2016 Al-Baath University Training Camp Contest-1 G
    2016 Al-Baath University Training Camp Contest-1 F
    2016 Al-Baath University Training Camp Contest-1 D
    2016 Al-Baath University Training Camp Contest-1 C
    2016 Al-Baath University Training Camp Contest-1 B
    2016 Al-Baath University Training Camp Contest-1 A
    2015年江西理工大学C语言程序设计竞赛(初级组)
    2013年江西理工大学C语言程序设计竞赛(初级组)
  • 原文地址:https://www.cnblogs.com/colinliu/p/scrollview-listview.html
Copyright © 2011-2022 走看看