2 d shaoshuai d_shaoshuai 于 2016.05.10 17:26 提问

listview重用item的问题 1C

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

2个回答

CSDNXIAON
CSDNXIAON   2016.05.10 17:33

关于ListView中item问题
listview item的问题
listView Item 焦点问题
----------------------同志你好,我是CSDN问答机器人小N,奉组织之命为你提供参考答案,编程尚未成功,同志仍需努力!

zhoudan_dan
zhoudan_dan   2016.05.10 17: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

d_shaoshuai
d_shaoshuai 大神没看清我的问题吧。。
大约 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
优化ListView时重用Item导致错位
常用的ListView的优化方式是使用getView方法的convertView参数和一个内部类ViewHolder配合来使用的 原理:如代码中,重用convertView意味着之后重新调用getView的时候if中的代码就不再执行了(getView方法是Adapter在绘制AbsList的时候每一个item都会调一次),那我们看看if中的代码是干什么的,初始化控件用的,findViewById
ListView复用和优化详解
前言 我们每一个Android开发人员对ListView的使用肯定是很熟悉的,然而多少人能真正的懂ListView的缓存机制呢,说白了就是ListView为了提高效率而内部实现的一种优化,而这种优化就需要复用ItemView(也就是item对应的View).那么下面楼主来对ListView和RecyclerView的item复用问题做一个深入的讲解
ListView乱谈之ListView中View重用的简单解析
简单分析ListView的回收机制
ListView不同布局的item的复用方法详解
废话不多说,直接上代码简介。 一、MainActivity和布局 public class HomeActivity extends Activity { @Bind(R.id.lv) ListView lv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(saved
Android中ListView复用导致其他Item显示异常
基于上一个博客内容在在有大量Item的情况下, Android会对ListView中的Item进行复用, 就会导致触发上面一个Item中的按钮后导致下面的按钮也跟着变红色边框代表手机屏幕 Item1、Item2、Item3是在屏幕上显示 Item4、Item5需要滑动才可见 点击Item1后滑动屏幕后发现Item4也被触发了 不想出现这种情况需要对被点击的项进行一些处理//定义一个列
listview 复用数据错误以及listview item中的控件之间修改状态
import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.View; import android.view.ViewGroup; import an
本人原创!解决安卓ListView复用问题最简单的两种方法。
ListView在安卓很多地方需要用得到,其实listview是基于MVC架构设计的,即数据model,视图view和控制器controller。安卓已帮我们写好该框架,我们只需往里面塞数据就行。对于一些简单的listview,我们常用arrayadapter来作为适配器,但这往往不能达到我们想要的结果,为了界面的功能和美观,我们往往需要自定义适配器。而适配器的基类baseadapter安卓已帮我
android中关于listView复用时出现错乱问题
我在ListView中子Item中有点击事件,当我选中之后会出现多个已经被选中的控件。出现这种问题的原因就是您的ListView 的 优化原因
Android之ListView的Adapter的复用
Android之ListView的Adapter的复用
listview中因复用产生展示错乱的解决方法
简单介绍listview中因复用产生展示错乱的解决方法