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

    -全文完-

  • 相关阅读:
    November 13th 2016 Week 47th Sunday The 1st Day
    November 12th 2016 Week 46th Saturday
    November 11th 2016 Week 46th Friday
    November 10th 2016 Week 46th Thursday
    November 9th 2016 Week 46th Wednesday
    November 8th 2016 Week 46th Tuesday
    windows 7文件共享方法
    Win7无线网络共享设置方法
    常量指针和指针常量
    如何查找局域网的外网ip
  • 原文地址:https://www.cnblogs.com/colinliu/p/scrollview-listview.html
Copyright © 2011-2022 走看看