2013-03-16 61 views
0

我的應用程序從網上下載數據(圖像和文本),並將其顯示爲ListView。在ListView適配器中我已經實現了內存緩存來存儲位圖。從ListView中檢索圖像的主要目的是在點擊行後將其傳遞給新的Activity。我知道我可以將圖片URL傳遞給新的活動,然後再次下載,但我不想這樣做。 是否有可能從ListView中檢索位圖?如果是的話,哪種方式實施起來效率最高? 在此先感謝從ListView中檢索位圖

編輯:

public class CinemasAdapter extends ArrayAdapter<Cinemas> { 

    private ArrayList<Cinemas> movieDataItems; 
    private Activity context; 

    private LinkedHashMap<String, Bitmap> bitmapCache = new LinkedHashMap<String, Bitmap>(); 

    public CinemasAdapter(Activity context, int textViewResourceId, ArrayList<Cinemas> movieDataItems) { 
     super(context, textViewResourceId, movieDataItems); 
     this.context = context; 
     this.movieDataItems = movieDataItems; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder = new ViewHolder(); 
     if (convertView == null) { 
      LayoutInflater vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = vi.inflate(R.layout.movie_data_row, null); 
      holder.poster = (ImageView) convertView.findViewById(R.id.movie_thumb_icon); 
      holder.bitmap = BitmapFactory.decodeResource(holder.poster.getResources(), R.drawable.no_image); 
      convertView.setTag(holder);   
     } 
     else{ 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     Cinemas movie = movieDataItems.get(position); 

     if (movie!=null){ 
        String url = movie.poster(); 

         if (url != null) { 
          Bitmap bitmap = fetchBitmapFromCache(url); 
          if (bitmap == null) { 
           loadBitmap(url,holder.poster,holder.bitmap); 
          } 
          else { 
           holder.poster.setImageBitmap(bitmap); 
          } 
         } 
         else { 
          holder.poster.setImageResource(R.drawable.no_image); 
         } 
      } 
     else { 
      holder.poster.setImageResource(R.drawable.no_image); 
      } 

     return convertView; 

    }   

    private void addBitmapToCache(String url, Bitmap bitmap) { 

     if (bitmap != null) { 
      synchronized (bitmapCache) { 
       bitmapCache.put(url, bitmap); 
      } 
     } 
    } 

    private Bitmap fetchBitmapFromCache(String url) { 
     synchronized (bitmapCache) { 
      final Bitmap bitmap = bitmapCache.get(url); 
      if (bitmap != null) { 
       bitmapCache.remove(url); 
       bitmapCache.put(url, bitmap); 
       return bitmap; 
      } 
     } 
     return null; 
    } 

    private class BitmapDownloaderTask extends AsyncTask<String, Void, Bitmap> { 

     private String url; 
     private final WeakReference<ImageView> imageViewReference; 
     private Cinemas movie; 

     public BitmapDownloaderTask(ImageView imageView, Cinemas mov) { 
      imageViewReference = new WeakReference<ImageView>(imageView); 
      movie = mov; 
     } 

     @Override 
     protected Bitmap doInBackground (String... source) { 
      url = source[0]; 
      Bitmap image; 
      try{ 
       image = BitmapFactory.decodeStream(new URL(url).openConnection().getInputStream()); 
       return image; 
       } 
      catch(Exception e){Log.e("Error", e.getMessage()); e.printStackTrace();} 
      return null; 
      } 


     @Override 
     protected void onPostExecute(Bitmap bitmap) { 
      if (isCancelled()) { 
       bitmap = null; 
      } 
      if (imageViewReference != null && bitmap != null) { 
       final ImageView imageView = imageViewReference.get(); 
       final BitmapDownloaderTask bitmapWorkerTask = 
         getBitmapWorkerTask(imageView); 
       if (this == bitmapWorkerTask && imageView != null) { 
        imageView.setImageBitmap(bitmap); 
        addBitmapToCache(url); 
        movie.setBitmap(bitmap); 
       } 
      } 
     } 
    } 

    private static class ViewHolder{ 
    ImageView poster; 
    Bitmap bitmap; 
} 

    static class AsyncDrawable extends BitmapDrawable { 
    private final WeakReference<BitmapDownloaderTask> bitmapWorkerTaskReference; 

    public AsyncDrawable(Resources res, Bitmap bitmap, 
      BitmapDownloaderTask bitmapWorkerTask) { 
      super(res, bitmap); 
      bitmapWorkerTaskReference = new WeakReference<BitmapDownloaderTask>(bitmapWorkerTask); 
    } 

    public BitmapDownloaderTask getBitmapWorkerTask() { 
     return bitmapWorkerTaskReference.get(); 
    } 
} 

    private static BitmapDownloaderTask getBitmapWorkerTask(ImageView imageView) { 
     if (imageView != null) { 
      final Drawable drawable = imageView.getDrawable(); 
      if (drawable instanceof AsyncDrawable) { 
       final AsyncDrawable asyncDrawable = (AsyncDrawable) drawable; 
       return asyncDrawable.getBitmapWorkerTask(); 
      } 
     } 
     return null; 
    } 

    public static boolean cancelPotentialWork(String data, ImageView imageView) { 
    final BitmapDownloaderTask bitmapWorkerTask = getBitmapWorkerTask(imageView); 

    if (bitmapWorkerTask != null) { 
     final String bitmapData = bitmapWorkerTask.url; 
     if (bitmapData != data) { 
      bitmapWorkerTask.cancel(true); 
     } else { 
      return false; 
     } 
    } 
    return true; 
} 

    public void loadBitmap(String resId, ImageView imageView, Bitmap bitmap) { 
    if (cancelPotentialWork(resId, imageView)) { 
     final BitmapDownloaderTask task = new BitmapDownloaderTask(imageView); 
     final AsyncDrawable asyncDrawable = new AsyncDrawable(imageView.getResources(), bitmap, task); 
     imageView.setImageDrawable(asyncDrawable); 
     task.execute(resId); 
    } 
} 
} 

回答

0

這將讓你從ImageView的一個位圖。

image_view.buildDrawingCache(); 
Bitmap bmap = image_view.getDrawingCache(); 

,現在你有派位到另一個活動如下:

位圖實現Parcelable,所以你總是可以通過它的意圖:

Intent intent = new Intent(this, NewActivity.class); 
intent.putExtra("BitmapImage", bmap); 

和檢索另一端:

Bitmap bitmap = (Bitmap) intent.getParcelableExtra("BitmapImage"); 
+0

如何從ListView中檢索ImageView obj? – 2013-03-16 16:55:42

+0

這將取決於你如何實現你的ListView項目... – dmon 2013-03-16 16:58:07

+0

請發佈你的listview實現,然後只有我們可以sugest方式 – 2013-03-16 16:59:48