• Android中自定义Adapter实现ListView动态刷新进度条


      这几天做上传图片时,实现动态更新进度条,花费了我不少脑筋,一是android不是很熟悉,二是自己java基础,或者说是编程基础不扎实,不会学以致用,这两发块,是以后加强的重点!

      费话不多说!说说我用到的几个知识,一是AsyncTask,实现异步上传,二是自定义Adapter,继承自BaseAdapter,activity使用的是ListActivity(这是费话哈……)

       这个小美女还不错哈!

    主代码:

      前面布局文件啊,获得组件啊,什么的就不写了……(这几天有点忙,代码没抽出来,有时间把代码贴出来……)

      继续自ArrayAdapter,主要看他重写的getView()方法,其中这个imageLoader.loadDrawable()方法的调用就是动态刷新的重点,在方法的参数中用接口来实现了一个回调函数,看到这个想法,不仅让我拍案叫绝啊(这个想法是在网上看到的),java中一直苦于不能像c++一样传函数,现在用接口完美解决。

    publicclass MyImageAndTextListAdapter extends ArrayAdapter<NewsBean> {

    public MyImageAndTextListAdapter(Activity activity,
    List
    <NewsBean> newsList) {
    super(activity, 0, newsList);
    }

    private AsyncImageLoader imageLoader =new AsyncImageLoader();

    private Map<Integer, View> viewMap =new HashMap<Integer, View>();

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
    View rowView
    =this.viewMap.get(position);

    if (rowView ==null) {
    LayoutInflater inflater
    = ((Activity) this.getContext())
    .getLayoutInflater();
    rowView
    = inflater.inflate(R.layout.news_row, null);

    NewsBean newsBean
    =this.getItem(position);

    TextView textView
    = (TextView) rowView.findViewById(R.id.title);
    textView.setText(newsBean.getTitle());

    final ImageView imageView = (ImageView) rowView.findViewById(R.id.image);

    imageLoader.loadDrawable(newsBean.getImage(),
    new ImageCallback() {
    public void
    imageLoaded(Drawable imageDrawable, String imageUrl) {
    imageView.setImageDrawable(imageDrawable);
    }
    });
    viewMap.put(position, rowView);
    }
    return rowView;
    }

    }

    AsyncImageLoader,异步下载的实现类,在这个类中提供动态刷新页面的接口,重点在内部接口ImageCallback中的imageLoaded方法,主要是通过接口调用这个方法来实现刷新的,仔细看看,这个是不是很像观察者的设计模式,其实这里完全可以使用观察者设计模式,把内部接口抽出来,然后AsyncImageLoader实现,我觉得原作者在这里作为内部类的形式来处理是很有道理的,观察者的设计模式,是用来告诉多个人数据改变了,你们可以“行动”了,而这里,行动-->刷新界面就一个地方调用,其他地方不需要也不应该调用,有内部类来隐藏掉这些处理是很有必要的。

    publicclass AsyncImageLoader {
    private Map<String, SoftReference<Drawable>> imageCache=new HashMap<String, SoftReference<Drawable>>();

    public Drawable loadDrawable(final String imageUrl,final ImageCallback callback){
    if(imageCache.containsKey(imageUrl)){
    SoftReference
    <Drawable> softReference=imageCache.get(imageUrl);
    if(softReference.get()!=null){
    return softReference.get();
    }
    }
    final Handler handler=new Handler(){
    @Override
    publicvoid handleMessage(Message msg) {
    callback.imageLoaded((Drawable) msg.obj, imageUrl);
    }
    };
    new Thread(){
    publicvoid run() {
    Drawable drawable
    =loadImageFromUrl(imageUrl);
    imageCache.put(imageUrl,
    new SoftReference<Drawable>(drawable));
    handler.sendMessage(handler.obtainMessage(
    0,drawable));
    };
    }.start();
    returnnull;
    }

    protected Drawable loadImageFromUrl(String imageUrl) {
    try {
    return Drawable.createFromStream(new URL(imageUrl).openStream(), "src");
    }
    catch (Exception e) {
    thrownew RuntimeException(e);
    }
    }

    publicinterface ImageCallback{
    publicvoid imageLoaded(Drawable imageDrawable,String imageUrl);
    }
    }

    源码下载:https://files.cnblogs.com/xiaoQLu/ListViewAsynUpdate.rar

  • 相关阅读:
    再见,我的二零一七
    Tomcat 源码分析(二)——Request处理全过程
    帅案之上——作为开发者的远见与卓识
    Tomcat 源码分析(一)——启动与生命周期组件
    从代码质量谈起
    Java设计模式(四)——再谈观察者模式
    你所不了解的五条面试忠告
    见微知著——从自定义类型的operator==说起
    编码、散列与加解密
    数据结构与算法(c++)——双缓存队列
  • 原文地址:https://www.cnblogs.com/xiaoQLu/p/2042124.html
Copyright © 2020-2023  润新知