2013-03-16 4 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

이 당신에게 이미지 뷰에서 비트 맵을 얻을 것이다.

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를 가져올 수 있습니까? –

+0

ListView 항목을 어떻게 구현 했느냐에 따라 달라질 수 있습니다 ... – dmon

+0

listview 구현을 게시 한 다음에 만 설득 할 수 있습니다. –