七绝x 2016-05-10 09:26 采纳率: 0%
浏览 1277
已结题

listview重用item的问题

我现在有一个需求,一个音乐列表,点击其中某一项,则显示出进度条进行播放,由于listview重用
item的原理,比如:我一屏显示6项,点击第1项 显示出进度条,然而我把listview往下滑两项,新出来的这
一项由于重用了第一屏的item,新出来的也显示出了进度条,有什么办法解决吗?各位大神

  • 写回答

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 求解 yolo算法问题
  • ¥15 虚拟机打包apk出现错误
  • ¥30 最小化遗憾贪心算法上界
  • ¥15 用visual studi code完成html页面
  • ¥15 聚类分析或者python进行数据分析
  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝