2013-11-09 199 views
0

我有一个列表中的每个项目包含多个图像的ListView控件。
当我创建列表,我想异步下载图像,从而使列表可以显示快,他们正在下载的图像时,可以练习I.Android的映射异步下载图像的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常见的模式?谢谢!

回答

1

你需要实现一个适配器模式来填充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; 
     } 
    } 
} 

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