在一个listview中嵌套ListView可以吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在一个listview中嵌套ListView可以吗?相关的知识,希望对你有一定的参考价值。

参考技术A 前几天因为项目的需要,要在一个ListView中放入另一个ListView,也即在一个ListView的每个ListItem中放入另外一个
ListView。但刚开始的时候,会发现放入的小ListView会显示不完全,它的高度始终有问题。上网查了下,发现别人也有遇到这样的问题,而大多
数人都不推荐这样的设计,因为默认情况下android是禁止在ScrollView中放入另外的ScrollView的,它的高度是无法计算的。

又搜索了一下,发现有StackOverflow上的牛人已经解决了这个问题,经过试验发现是可以解决问题的,它的思路就是在设置完ListView的
Adapter后,根据ListView的子项目重新计算ListView的高度,然后把高度再作为LayoutParams设置给ListView,这
样它的高度就正确了,以下是源码:

Java代码
public class Utility
public static void setListViewHeightBasedOnChildren(ListView listView)
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null)
// pre-condition
return;


int totalHeight = 0;
for (int i = 0; i < listAdapter.getCount(); i++)
View listItem = listAdapter.getView(i, null, listView);
listItem.measure(0, 0);
totalHeight += listItem.getMeasuredHeight();


ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
listView.setLayoutParams(params);



只要在设置ListView的Adapter后调用此静态方法即可让ListView正确的显示在其父ListView的ListItem中。但是要注意
的是,子ListView的每个Item必须是LinearLayout,不能是其他的,因为其他的Layout(如RelativeLayout)没有
重写onMeasure(),所以会在onMeasure()时抛出异常。

在ScrollView中嵌套ListView(或者ScrollView)的另外一个问题就是,子ScrollView中无法滑动的(如果它没有显示完
全的话),因为滑动事件会被父ScrollView吃掉,如果想要让子ScrollView也可以滑动,只能强行截取滑动事件,有牛人在论坛中发过代码说
可以。虽然我没有亲自试过,但估计是可行的。

虽然在ScrollView中显示ScrollView在技术上的难题可以攻破,但是这样的设计却是非常差的用户体验因为用户会不容易看到和操作子
ScrollView中的内容。比如好的设计是,父ListView的每个Item只显示概括性的描述,然后点击其Item会进入另外一个页面来详细描述
和展示以及对这个Item的操作。

浅谈ScrollView嵌套ListView及ListView嵌套的高度计算

引言

  在Android开发中,我们有时会需要使用ScrollView中嵌套ListView的需求。例如:在展示信息的ListView上还有一部分信息展示区域,并且要求这部分信息展示区域在ListView信息比较多的时候也是可以滑动的,而不是固定不变的。这时,我们一般会将ScrollView和ListView嵌套在一起使用。但是这会导致ListView展示不全,然后也会有滑动冲突问题。下面我们来看看怎么解决。

解决方案

  主动计算和设置ListView的高度,这样就可以合理的展示ListView的高度。代码如下:

 1 public void setListViewHeightBasedOnChildren(ListView listView) {
 2         // 获取ListView对应的Adapter
 3         ListAdapter listAdapter = listView.getAdapter();
 4         if (listAdapter == null) {
 5             return;
 6         }
 7         int totalHeight = 0;
 8         // listAdapter.getCount()返回数据项的数目
 9         for (int i = 0; i < listAdapter.getCount(); i++) {
10             View listItem = listAdapter.getView(i, null, listView);
11             // 计算子项View 的宽高
12             listItem.measure(0, 0);
13             // 统计所有子项的总高度
14             totalHeight += listItem.getMeasuredHeight();
15         }
16         ViewGroup.LayoutParams params = listView.getLayoutParams();
17         params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
18         // listView.getDividerHeight()获取子项间分隔符占用的高度
19         // params.height最后得到整个ListView完整显示需要的高度
20         listView.setLayoutParams(params);
21     }

 

以上是关于在一个listview中嵌套ListView可以吗?的主要内容,如果未能解决你的问题,请参考以下文章

我可以使用 Simpleadapter 和 hashmap 用嵌套数组填充 listView 吗?

如何在ScrollView中嵌套ListView

如何在ScrollView中嵌套ListView

浅谈ScrollView嵌套ListView及ListView嵌套的高度计算

求助scrollview嵌套viewpager 放listview 不能滑动

浅谈android中的ListView合集系列之解决ScrollView和ListView嵌套冲突