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);
}
}
}
어떻게 ListView에서 ImageView obj를 가져올 수 있습니까? –
ListView 항목을 어떻게 구현 했느냐에 따라 달라질 수 있습니다 ... – dmon
listview 구현을 게시 한 다음에 만 설득 할 수 있습니다. –