【问题标题】:Android mapping async downloaded image to listviewAndroid 将异步下载的图像映射到列表视图
【发布时间】:2013-11-09 20:54:45
【问题描述】:

我有一个 ListView,列表中的每个项目都包含多个图像。
当我创建列表时,我想异步下载图像,以便列表可以快速显示,并且图像可以在下载时填充。

我扩展了AsyncTask 类并实现了一个简单的下载方法。但是,我不确定如何将图像更新回列表视图中的正确位置:

@Override
protected void onPostExecute(Bitmap result) {

    // TODO show the downloaded image to the list

    super.onPostExecute(result);
}

这是我的类定义:

public class ImageDownloadWorker extends AsyncTask<String, Void, Bitmap>

还有我的doInBackground 方法:

@Override
protected Bitmap doInBackground(String... params) {

    try {
        return downloadBitmap(params[0]);
    } catch (ClientProtocolException e) {

        return null;
    } catch (Exception e) {

        return null;
    }
}

我们应该使用什么常见模式将下载的图像映射到列表中正确列表项的正确 ImageView?谢谢!

【问题讨论】:

    标签: java android android-layout listview android-asynctask


    【解决方案1】:

    您需要实现一个适配器模式来填充列表视图。在您的情况下,您可以创建一个自定义适配器类并扩展 BaseAdapter 并实现其所有方法。模式是这样的。

    MainActivity.java

    public class MainActivity extends Activity {
    
        private ListView listView;
        private CustomAdapter adapter;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            setContentView(R.layout.main);
            listView = findViewById(android.R.id.list);
        }
    
        private class ImageDownloader extends AsyncTask<String, Void, Bitmap> {
            @Override
            protected Bitmap doInBackground(String... strings) {
                try {
                  return downloadBitmap(params[0]);
                } catch (ClientProtocolException e) {
                   return null;
                } catch (Exception e) {
                   return null;
                }
            }
    
            @Override
            protected void onPostExecute(Bitmap bitmap) {
                adapter = new CustomAdapter(bitmap);
                listView.setAdapter(adapter);
    
                super.onPostExecute(bitmap);
            }
        }
    
        private class CustomAdapter extends BaseAdapter {
    
            private Bitmap bitmap;
            private LayoutInflater inflater = null;
    
            class ViewHolder {
                ImageView image;
            }
    
            public CustomAdapter(Bitmap bitmap) {
                this.bitmap = bitmap;
                inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            }
    
            @Override
            public int getCount() {
                return 0;
            }
    
            @Override
            public Object getItem(int i) {
                return null;
            }
    
            @Override
            public long getItemId(int i) {
                return 0;
            }
    
            @Override
            public View getView(int i, View convertView, ViewGroup parent) {
                final ViewHolder holder;
                if(convertView == null) {
                    convertView = inflater.inflate(R.layout.list_item, parent, false);
    
                    holder.image = convertView.findViewById(R.id.imageView);
    
                    convertView.setTag(holder);
                } else {
                    holder = (ViewHolder) convertView.getTag();
                }
    
                holder.image.setImageBitmap();
    
                return convertView;
            }
        }
    }
    

    main.xml

    <?xml version="1.0" encoding="utf-8"?>
    
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <ListView
        android:id="@android:id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />
    
    </LinearLayout>
    

    list_item.xml

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <ImageView
        android:id="@+id/imageView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        />
    
    </LinearLayout>
    

    但是,当您将许多图像加载到列表视图中时,请创建一个 ArrayList 并将其发送到 listAdapter

    【讨论】:

      【解决方案2】:

      在很多项目中我都需要你做同样的事情,这个库非常有用并且使用起来非常简单:

      https://github.com/koush/UrlImageViewHelper

      【讨论】:

        猜你喜欢
        • 2012-07-19
        • 2015-03-16
        • 1970-01-01
        • 1970-01-01
        • 2018-09-12
        • 2012-12-05
        • 1970-01-01
        • 2011-10-04
        • 2013-10-05
        相关资源
        最近更新 更多