3
回答
listView异步加载出现层叠闪烁
终于搞明白,存储TCO原来是这样算的>>>   

@xesam 你好,想跟你请教个问题:为什么吧listView在开启了几个线程加图片时快速滑动,出现图片层叠显示错位等情况,我查了一下大概都是说加载的慢还没加载完就已经到另外的item了,但是这个我做了一下优化还是不行,还请大神多多指点啊,拜托。

这个是我getView的代码,您要是看不太清楚,我给您工程文件。

public View getView(int position, View convertView, ViewGroup parent) {

ContentHolder holder= new ContentHolder();

if(urls.contains(position)) {

convertView= images.get(position).get();

}else {

if(convertView!= null) {

holder= (ContentHolder) convertView.getTag();

}else {

convertView= inflater.inflate(R.layout.item, null);

holder.icon= (ImageView) convertView.findViewById(R.id.thumbnail);

holder.name= (TextView) convertView.findViewById(R.id.item_name);

holder.size= (TextView) convertView.findViewById(R.id.item_size);

}

}

setContent(convertView, position, holder);

convertView.setTag(holder);

return convertView;

}

public void setContent(View convertView, int position, ContentHolder holder) {

if(!isBusy) {

setImage(holder,position);

if(!urls.contains(position)) {

urls.add(position);

images.add(new SoftReference<View>(convertView));

}

// setBitmap(holder,position);

holder.icon.setImageBitmap(bitmap);

holder.name.setText(lists[position].getName());

holder.size.setText((lists[position].length()/ 1000/ 1000.0)+ "M");

}

}

@SuppressLint("HandlerLeak")

private void setImage(final ContentHolder holder, int position) {

imageLoader.loadDrawable(lists[position].getAbsolutePath(), 80, 80, new ImageCallBack() {

@Override

public void imageLoaded(Bitmap drawable) {

bitmap= drawable;

}

}, new Handler(){

@Override

public void handleMessage(Message msg) {

super.handleMessage(msg);

bitmap= (Bitmap) msg.obj;

holder.icon.setImageBitmap(bitmap);

}

});

}

下面是loadDrawable:

public Bitmap loadDrawable(final String imageUrl, final int width, final int height, final ImageCallBack callBack, final Handler handler) {

if(urls.contains(imageUrl)) {

SoftReference<Bitmap> softReference = images.get(urls.indexOf(imageUrl));

if (softReference.get() != null) {

return softReference.get();

}

}

// 缓存中没有图像,则从网络上取出数据,并将取出的数据缓存到内存中

executorService.submit(new Thread() {

public void run() {

try {

final Bitmap drawable = loadImageFromUrl(imageUrl,width, height);

// imageCache.put(imageUrl, new SoftReference<Bitmap>(drawable));

urls.add(imageUrl);

images.add(new SoftReference<Bitmap>(drawable));

Message msg= new Message();

msg.obj= drawable;

handler.sendMessage(msg);

} catch (Exception e) {

throw new RuntimeException(e);

}

}

});

return null;

}

请帮忙看下,我最近一直找这个找不明白。还请多多指点啊,大神。

<无标签>
举报
找到组织
发帖于4年前 3回/593阅
顶部