近期做一款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; } }