首页 > 代码库 > Android ListView 和 ScrollView 冲突问题

Android ListView 和 ScrollView 冲突问题

近期做一款APP,当中有一个类似微博的评论功能的界面,先是列出微博的正文内容和图片等。然后下边是评论。

一開始就想着用一个ScrollView把主要内容和评论区的ListView包起来。然后加入各个控件的内容就可以(对,感觉上有点像这个CSDN博客的编辑界面嘛),可是写出来之后发现ListView仅仅显示出了一个条目的高度。并且不能滑动,网上搜了一下发现原因是ScrollView和ListView都是可滑动的,把它们放在一块会有冲突。最后还是ScrollView获得了焦点。ListView不能滑动。网上的解决方法最多的是在载入ListView时用getMeasure计算每一个条目和切割线的高度,然后相加,把结果设置为ListView控件的高度,只是貌似是仅仅适用于ListView每一个条目高度都一样的情况(没有试过。非常奇怪为什么会这样)。要么就是自己定义一个继承自ListView的控件,也是事先设置好ListView的高度。但这样总归比較麻烦。并且精确度不如由系统自己构造好。

懒癌发作实在不想自己去做这些事情,于是便想试一下比較投机的方法,就是在ListView的Adapter的getView方法中依据position构造不同的界面,即假设position是0,则用原来主要信息(微博正文,图片)的xml文件取inflate convertView,否则就用评论条目的xml去inflate,经试验果然可行。之后不死心想看下有没有更好的实现方法。去overflow上找了一下,发现有人推荐的方法和我的几乎相同。所以觉得这样的方法是比較好的,不须要做额外的工作,仅仅须要把inflate的工作由主Activity放在Adapter里就能够了。


getView方法

@Override
public View getView(int position, View convertView, ViewGroup parent)
{
	/*主信息界面*/
	if(0 == position)
	{
		MainHolder holder = null;
		convertView = inflater.inflate(R.layout.info, parent, false);
		holder = new MainHolder();
		convertView.setTag(holder);
                ······
                ······
	}
	/*评论界面*/
	else
	{
		ItemHolder holder = null;
		convertView = inflater.inflate(R.layout.item, parent, false);
		holder = new ItemHolder();
		convertView.setTag(holder);
		······
		······
		return convertView;
	}
}


Android ListView 和 ScrollView 冲突问题