android中ListView异步加载图片时的图片错位问题解决方案

本文介绍了如何在Android应用中处理ListView图片异步加载时出现的错位问题。通过设置convertView和ViewHolder优化性能,使用ImageView的tag保存图片URL。在异步下载图片完成后,利用tag找到对应的ImageView并设置图片。同时,利用HashMap存储url与任务的对应关系,避免重复创建AsyncTask。关键在于正确管理convertView和异步下载的生命周期。
摘要由CSDN通过智能技术生成
  1.   

加入访问网络和读取,写入sdcard的权限。

[java]  view plain copy

  1.   
  2.   
  3.   

接下来,我们来看看MainActivity.java。性能考虑,我们使用convertView和ViewHolder来重用控件。这里涉及到比较关键的一步,我们会在getView的时候给ViewHolder中的ImageView设置tag,其值为要放置在该ImageView上的图片的url地址。这个tag很重要,在异步下载图片完成回调的方法中,我们使用findViewWithTag(String url)来找到ListView中对应的ImagView,然后给该ImageView设置图片即可。其他的就是设置adapter的一般操作了。

[java]  view plain copy

  1. public class MainActivity extends Activity {

  2. ListView mListView;

  3. ImageDownloader mDownloader;

  4. MyListAdapter myListAdapter;

  5. private static final String TAG = “MainActivity”;

  6. int m_flag = 0;

  7. private static final String[] URLS = {

  8. //图片地址就不贴了,自己去这篇帖子中找吧:http://www.cnblogs.com/liongname/articles/2345087.html

  9. //其中有几张图片访问不了。

  10. };

  11. @Override

  12. public void onCreate(Bundle savedInstanceState) {

  13. super.onCreate(savedInstanceState);

  14. setContentView(R.layout.main);

  15. Util.flag = 0;

  16. mListView = (ListView) findViewById(R.id.listview);

  17. myListAdapter = new MyListAdapter();

  18. mListView.setAdapter(myListAdapter);

  19. }

  20. private class MyListAdapter extends BaseAdapter {

  21. private ViewHolder mHolder;

  22. @Override

  23. public int getCount() {

  24. return URLS.length;

  25. }

  26. @Override

  27. public Object getItem(int position) {

  28. return URLS[position];

  29. }

  30. @Override

  31. public long getItemId(int position) {

  32. return position;

  33. }

  34. @Override

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

  36. //只有当convertView不存在的时候才去inflate子元素

  37. if (convertView == null) {

  38. convertView = getLayoutInflater().inflate(R.layout.single_data,

  39. null);

  40. mHolder = new ViewHolder();

  41. mHolder.mImageView = (ImageView) convertView.findViewById(R.id.image_view);

  42. mHolder.mTextView = (TextView) convertView.findViewById(R.id.text_view);

  43. convertView.setTag(mHolder);

  44. }else {

  45. mHolder = (ViewHolder) convertView.getTag();

  46. }

  47. final String url = URLS[position];

  48. mHolder.mTextView.setText(url != null ? url.substring(url.lastIndexOf("/") + 1) : “”);

  49. mHolder.mImageView.setTag(URLS[position]);

  50. if (mDownloader == null) {

  51. mDownloader = new ImageDownloader();</

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值