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

本文介绍了一种解决Android中ListView在异步加载图片时出现图片错位的方案。通过设置ImageView的tag为图片URL,并使用ViewHolder重用控件,配合ImageDownloader类异步下载图片。在下载完成后,利用findViewWithTag找到对应的ImageView设置图片,避免了图片错位。同时,通过使用map存储任务,确保相同URL的图片只下载一次,提高了性能。
摘要由CSDN通过智能技术生成
  1. <TextView

  2. android:layout_width=“wrap_content”

  3. android:layout_height=“wrap_content”

  4. android:layout_alignTop="@id/image_view"

  5. android:layout_alignBottom="@id/image_view"

  6. android:layout_marginLeft=“20dp”

  7. android:layout_alignParentRight=“true”

  8. android:gravity=“center_vertical”

  9. android:layout_toRightOf="@id/image_view"

  10. android:singleLine=“true”

  11. android:ellipsize=“end”

  12. android:text="@string/hello"

  13. android:id="@+id/text_view"

  14. />

  15.   

加入访问网络和读取,写入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;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值