2013-11-09 168 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