Android ListView和异步加载图片的问题



1、重用convertview的优点和用法老衲就不在多言了,今天老衲讲的问题是异步加载图片错位的问题,

         比较巧妙的方法是使用setTag()方法:

 @Override
 public View getView(int position, View convertView, ViewGroup parent) {
  ViewHolder holder;
 
  if (convertView == null) {
   convertView = inflator.inflate(R.layout.my_layout, null);
 
   TextView nameTextView = (TextView) convertView
     .findViewById(R.id.title);
   TextView bottomText = (TextView) convertView
     .findViewById(R.id.bottomtext);
   ImageView iconView = (ImageView) convertView
     .findViewById(R.id.article_icon);
   holder = new ViewHolder();
   holder.nameTextView = nameTextView;
   holder.bottomText = bottomText;
   holder.iconView = iconView;
   convertView.setTag(holder);
  } else {
   holder = (ViewHolder) convertView.getTag();
  }
 
  Article article = articles.get(position);
  holder.nameTextView.setText(article.getTitle());
  holder.bottomText.setText(article.getAuthor() + " | "
    + article.getPubDate());
 
 holder.iconView.setTag(URLS[position]); // 在BitmapManager加载图片完毕以后通过url找这个对象, 然后加载图片.
  BitmapManager.INSTANCE.loadBitmap(URLS[position], holder.iconView, 32,32);
 
  return convertView;
 }
}

3. 加载图片的时候如果滑动就会出现卡的现象, 这种时候需要判断是否在滑动, 如果滑动就暂停加载图片. 用thread的lock机制来解决;
4.异步加载网络图片, 最好做二级缓存, 在本地保存一分备份儿, 如果在本地查找不到以后再去网上下载;
5、这个关于滑动是停止加载图片的问题,老衲也参考了一些资料,分享一下心得:
<p>      在我们使用新浪微博的时候,细心的同学一定发现了,在滑动的过程中,图片是没有被加载的,而是在滑动停止时,才加载图片了。</p><p>两个问题,一个对策:</p><p>1、在滑动停止的时候,如何获得需要加载的图片控件?</p><p>2、因为listiew在初始化完成的时候,OnScrollListener的onScrollStateChanged与onScroll并未被触发,如何初始化第一页的图片?</p><p>   直接上代码说话:</p><p><pre class="java" name="code">package com.test.list;
 
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
 
public class TestAndroidListActivity extends Activity {
 
    private int start_index, end_index;
 
    // 判断是否是初始化
    private boolean isInit = false;
    private ListView list;
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        this.initList();
    }
 
    private BaseAdapter adapter = new BaseAdapter() {
 
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            // TODO Auto-generated method stub
            View v;
            if (convertView == null) {
                v = getLayoutInflater().inflate(R.layout.list_item, null);
                v.setTag(v);
            } else {
                v = (View) convertView.getTag();
                ImageView iv = (ImageView) v.findViewById(R.id.img);
                iv.setImageResource(R.drawable.ic_launcher);
            }
            ImageView iv = (ImageView) v.findViewById(R.id.img);
            // 给图片控件设置上对应的位置编号
            iv.setTag(position);
            if (!isInit) {
                iv.setImageResource(R.drawable.update_log);
            }
 
            return v;
        }
 
        @Override
        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return 0;
        }
 
        @Override
        public Object getItem(int position) {
            // TODO Auto-generated method stub
            return null;
        }
 
        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return 140;
        }
    };
 
    private void initList() {
        // TODO Auto-generated method stub
        list = (ListView) this.findViewById(R.id.list);
        list.setAdapter(adapter);
        list.setOnScrollListener(new OnScrollListener() {
 
            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {
                // TODO Auto-generated method stub
                isInit = true;
                switch (scrollState) {
                case OnScrollListener.SCROLL_STATE_IDLE:// 滑动停止
                    for (; start_index < end_index; start_index++) {
                        ImageView img = (ImageView) list.findViewWithTag(start_index);
                        img.setImageResource(R.drawable.update_log);
                    }
                    break;
 
                default:
                    break;
                }
            }
 
            @Override
            public void onScroll(AbsListView view, int firstVisibleItem,
                    int visibleItemCount, int totalItemCount) {
                // TODO Auto-generated method stub
                // 设置当前屏幕显示的起始index和结束index
                start_index = firstVisibleItem;
                end_index = firstVisibleItem + visibleItemCount;
 
            }
        });
 
    }
}

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值