您的位置:首页 > 其它

项目中用到listview总结(一)

2016-05-27 11:30 323 查看
 1,ScrollView嵌套Listview,网上有很多种解决方案,我这里用的是重新绘制listview的高度使得显示正常,如下:

public class ListViewInSrcollView extends ListView {
public ListViewInSrcollView(Context context) {
super(context);
}

public ListViewInSrcollView(Context context, AttributeSet attrs) {
super(context, attrs);
}

//重写该方法,达到使ListView适应ScrollView的效果
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,

MeasureSpec.AT_MOST);

super.onMeasure(widthMeasureSpec, expandSpec);

}
}
2,我在用自定义封装的View时候,把它放进listview里,即listview的item布局文件就是一个自定义View,当在adapter里面获取
convertView时,再用convertView.gettag会报错,原因是convertView与holder.xxxx指向的是同一个对象。解决方法就是布局item外面
可加一层linearlayout或其他多种方式,参考:点击打开链接
3,当我的item布局文件不同时,为了复用ViewHolder,将其保存在convertView中,但是取出来强制转换时会出现错误,因为当相邻item布局
不同时,此时的为ViewHolder2,而convertView里面保存的是ViewHolder1,所以会出错。解决办法是,取出对象用instanceof判断,如果不
是该ViewHolder的对象,则重新创建新的convertView
<pre name="code" class="java">DeviceHolder deviceHolder = null;
if (convertView == null ||
(convertView != null && !(convertView.getTag() instanceof DeviceHolder))) {
deviceHolder = new DeviceHolder();
//重新创建新的convertView,这里不贴出代码了。

convertView.setTag(deviceHolder);

} else {
deviceHolder = (DeviceHolder) convertView.getTag();
}

4,由于我的listview里面item包含各种TextView,EditText,我保存这些数据发送至服务器。在获取每个item是
我用的是listview.getChildCount();但是运行时报错,原因是我添加了footer,所以应该减1,如下
for (int i = 0; i < listview.getChildCount()-1; i++) {
//ServiceView是我自定义的View,item就是一个ServiceView,这也是上面问题2的原因
ServiceView serviceView = (ServiceView) listView.getChildAt(i);

}
但是当我有多个item时,发现保存的数据只有一个item的,最后查看官方文档才发现问题出在listview.getChildCount();该方法获得的是
当前listview的可见的item的数量,而不是所有的item的个数。正确的应该用Adapter的getCount()方法来获取。当你的item全部显示,
无需滑动的话二者的数量是一直的,但是item个数多,以至于需要滑动的话,getChildCount()会少于getCount;所以这点要注意。



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  listview