我现在有一个需求,一个音乐列表,点击其中某一项,则显示出进度条进行播放,由于listview重用
item的原理,比如:我一屏显示6项,点击第1项 显示出进度条,然而我把listview往下滑两项,新出来的这
一项由于重用了第一屏的item,新出来的也显示出了进度条,有什么办法解决吗?各位大神
listview重用item的问题
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
1条回答 默认 最新
- zhoudan_dan 2016-05-10 09:34关注
1)自定义布局中控件的高度绝对不能是 内容包裹 wrap_content,应该是匹配父控件或者指定具体的高度。否则在android代码中会测l量该控件的高度,多次调用getView();
2)利用convertview的重用,判断是否为空, 只有当convertView为空的时候,才去用填充器填充视图 ,如果不为空,则重用该view。因为 填充是非常耗时的操作,因为要解析xml文件
public View getView(int position, View convertView, ViewGroup parent) {
View v;
if (convertView == null) {
v = LayoutInflater.from(getApplicationContext()).inflate(
R.layout.item, parent, false);
} else {
v = convertView;
}
return v;
}
3)使用自定义内部类保存控件的引用,可以防止图片错误和优化findviewbyid();
public static class ViewHolder {
public TextView tv;
public ImageView iv;
public int position;
}if (convertView == null) {
v = LayoutInflater.from(getApplicationContext()).inflate(R.layout.item, parent, false);
// 优化第三步
// 利用ViewHolder保存控件的引用
// 因为 不论何时,在同一个ViewGroup中findViewById()去找 , 同一个控件,找到的对象是同一个
ViewHolder vh = new ViewHolder();
vh.tv = (TextView) v.findViewById(R.id.text);
vh.iv = (ImageView) v.findViewById(R.id.img);
v.setTag(vh);
} else {
v = convertView;
}
ViewHolder vh = (ViewHolder) v.getTag();
所以不应该在if语句外findViewById(),那样会多次执行不必要的find。
4)防止图片错位,因为多线程中,图片下载的事件不确定,当图片下载没完成时用户把屏幕滑动出去,而且因为convertview重用,所以有可能其他位置已经改变了该convertview的属性,如位置等。然后下载完的内容就放在了错误的位置
来自
http://zhidao.baidu.com/link?url=z-fKthJqLJgvHdJaKt7EupFe4WHL0zGZJi2iAbxkDgFuw5PD6u8oCcOfH5D7AjBFo7rWKNAkhmrA8xGkFMWzI1pHU0mtyv7ootY_B50qErm解决 无用评论 打赏 举报
悬赏问题
- ¥15 #MATLAB仿真#车辆换道路径规划
- ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
- ¥15 数据可视化Python
- ¥15 要给毕业设计添加扫码登录的功能!!有偿
- ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
- ¥15 微信公众号自制会员卡没有收款渠道啊
- ¥100 Jenkins自动化部署—悬赏100元
- ¥15 关于#python#的问题:求帮写python代码
- ¥20 MATLAB画图图形出现上下震荡的线条
- ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘