Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android将异步下载的图像映射到listview_Java_Android_Android Layout_Listview_Android Asynctask - Fatal编程技术网

Java Android将异步下载的图像映射到listview

Java Android将异步下载的图像映射到listview,java,android,android-layout,listview,android-asynctask,Java,Android,Android Layout,Listview,Android Asynctask,我有一个列表视图,列表中的每个项目都包含多个图像。 当我创建列表时,我希望异步下载图像,这样列表可以快速显示,并且图像可以在下载时填充 我扩展了AsyncTask类并实现了一个简单的下载方法。但是,我不确定如何将图像更新回列表视图中的正确位置: @Override protected void onPostExecute(Bitmap result) { // TODO show the downloaded image to the list super.onPostExe

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

我扩展了
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>

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

您需要实现一个适配器模式来填充listview。在您的情况下,您可以创建一个自定义适配器类,扩展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;
        }
    }
}
公共类MainActivity扩展活动{
私有列表视图列表视图;
专用自定义适配器;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
listView=findviewbyd(android.R.id.list);
}
私有类ImageDownloader扩展异步任务{
@凌驾
受保护位图doInBackground(字符串…字符串){
试一试{
返回下载位图(参数[0]);
}捕获(客户端协议例外e){
返回null;
}捕获(例外e){
返回null;
}
}
@凌驾
受保护的void onPostExecute(位图){
适配器=新的自定义适配器(位图);
setAdapter(适配器);
onPostExecute(位图);
}
}
私有类CustomAdapter扩展了BaseAdapter{
私有位图;
专用充气机=空;
类视图持有者{
图像视图图像;
}
公共自定义适配器(位图){
this.bitmap=位图;
充气器=(LayoutInflater)getSystemService(Context.LAYOUT\u充气器\u SERVICE);
}
@凌驾
public int getCount(){
返回0;
}
@凌驾
公共对象getItem(int i){
返回null;
}
@凌驾
公共长getItemId(int i){
返回0;
}
@凌驾
公共视图getView(int i、视图转换视图、视图组父视图){
最终持票人;
if(convertView==null){
convertView=充气机。充气(R.layout.list_项,父项,false);
holder.image=convertView.findViewById(R.id.imageView);
convertView.setTag(支架);
}否则{
holder=(ViewHolder)convertView.getTag();
}
holder.image.setImageBitmap();
返回视图;
}
}
}
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>


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

我需要在许多项目中执行与您相同的操作,并且此库非常有用且使用非常简单:

<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>