2013-04-11 68 views
0

我與這個人有同樣的問題 Listview shows wrong images如何在listview中緩存imageview?

我看到了我必須緩存它的解決方案。但在我的緩存中,我不確定如何應用解決方案中給出的緩存。我不斷收到錯誤。

我懷疑這是我有問題的一部分:

holder.icon.setImageBitmap(bitmapList[position]); 

      //loadImageBitmap(mObjects.get(position), position); 

      //onBitmapLoaded(position, holder.mTask.myBitmap()); 

下面是代碼。 Adapter.java 公共類適配器擴展BaseAdapter {

private static final String TAG = "Adapter"; 
    private Activity mActivity; 
    public ArrayList<Data> mObjects; 

    static class ViewHolder { 
     ImageView icon; 
     TextView title; 
     WebView newimage; 
     DownloadImageTask mTask; 
     public void setOnClickListener(OnItemClickListener onItemClickListener) { 
      // TODO Auto-generated method stub 

     } 
    } 



    private Bitmap[] bitmapList; 
    private Bitmap bitmapPlaceholder; 

    private void initBitmapListWithPlaceholders(){ 
    // call this whenever the list size changes 
    // you can also use a list or a map or whatever so you 
    // don't need to drop all the previously loaded bitmap whenever 
    // the list contents are modified 
     int count = getCount(); 
     bitmapList = new Bitmap[count]; 
     for(int i=0;i<count;i++){ 
      bitmapList[i]=bitmapPlaceholder; 
     } 
    } 

    private void onBitmapLoaded(int position, Bitmap bmp){ 
    // this is your callback when the load async is done 
     bitmapList[position] = bmp; 
    } 

    public Adapter(Activity activity, ArrayList<Data> mObjects) { 

     this.mActivity = (Activity) activity; 
     this.mObjects = mObjects; 


    } 

    public void setObjects(ArrayList<Data> mObjects) { 
     this.mObjects = mObjects; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     Data item = mObjects.get(position); 
     View rowView = convertView; 

     if (rowView == null) { 
      LayoutInflater inflater = mActivity.getLayoutInflater(); 
      rowView = inflater.inflate(R.layout.item, parent, false); 


      ViewHolder viewHolder = new ViewHolder(); 
      viewHolder.icon = (ImageView) rowView.findViewById(R.id.image); 
      viewHolder.title = (TextView) rowView.findViewById(R.id.title); 

      viewHolder.newimage =(WebView)rowView.findViewById(R.id.newimage); 


      rowView.setTag(viewHolder); 
     } 

     ViewHolder holder = (ViewHolder) rowView.getTag(); 

     holder.title.setText(item.getmTitle()); 

     //String html = " <html><head></head><body><p font-size='8px'>" + item.getmImageUrl() + "</p><img src='" + item.getmImageUrl() + "' width='100%' height='100%'></body></html>"; 
     String html = " <html><head></head><body><img src='" + item.getmImageUrl() + "' width='100%' height='100%'></body></html>"; 




     holder.newimage.loadData(html, "text/html", "utf-8"); 

     holder.newimage.setFocusable(false); 
     holder.newimage.setClickable(false); 
     holder.setOnClickListener(new OnItemClickListener() { 

      private Object title; 

      public void onItemClick(AdapterView<?> parent, View v, int position, long id) { 
       //Toast.makeText(Adapter.this,"Button is clicked", Toast.LENGTH_LONG).show(); 
       Log.e("log_tag",this.title.toString() + " clicked"); 
      } 
     }); 

     //holder.icon.setBackgroundResource(R.drawable.ic_launcher); 
     holder.mTask = new DownloadImageTask(item.getmImageUrl(), holder.icon); 


     holder.icon.setImageBitmap(bitmapList[position]); 

     //loadImageBitmap(mObjects.get(position), position); 

     //onBitmapLoaded(position, holder.mTask.myBitmap()); 
     if (!holder.mTask.isCancelled()) { 
      holder.mTask.execute(); 
     } 


     return rowView; 
    } 

    @Override 
    public int getCount() { 

     return (this.mObjects.size()); 
    } 

    @Override 
    public Object getItem(int position) { 

     return (this.mObjects.get(position)); 
    } 

    @Override 
    public long getItemId(int position) { 

     return (position); 
    } 

    public AbsListView.RecyclerListener mRecyclerListener = new RecyclerListener(){ 

     public void onMovedToScrapHeap(View view) { 
      ViewHolder viewHolder = (ViewHolder) view.getTag(); 
      DownloadImageTask imagetask = viewHolder.mTask; 
      if (imagetask != null) { 
       imagetask.cancel(true); 
      } 
     } 

    }; 

    public void setOnClickListener(OnItemClickListener onItemClickListener) { 
     // TODO Auto-generated method stub 

    } 

DownloadImageTask.java

import java.io.FilterInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.net.MalformedURLException; 

import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.os.AsyncTask; 
import android.widget.ImageView; 

public class DownloadImageTask extends AsyncTask<Void, Void, Bitmap> { 
    public Bitmap g; 
    private String mUrl; 
    private ImageView mImageView = null; 

    public DownloadImageTask(String Url, ImageView imageView) { 

     mUrl = Url; 
     this.mImageView = imageView; 
    } 

    protected void onPostExecute(Bitmap result) { 
     super.onPostExecute(result); 
     if (result != null) { 
      mImageView.setImageBitmap(result); 
      //result.recycle(); 
     } 
    } 

    protected Bitmap doInBackground(Void... params) { 

     Bitmap bitmap = getBitmap(mUrl); 
     return bitmap; 
    } 

    public Bitmap getBitmap(String imageUrl) { 
     Bitmap mBitmap = null; 
     try { 

      /*URL newurl = new URL(imageUrl); 
      mBitmap = BitmapFactory.decodeStream(newurl.openConnection() .getInputStream()); */ 
      //mImageView.setImageBitmap(mBitmap); 

      /* 
      URL url = new URL(imageUrl); 
      HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
      InputStream is = conn.getInputStream(); 
      mBitmap = BitmapFactory.decodeStream(new FlushedInputStream(is));*/ 


      InputStream in = new java.net.URL(imageUrl).openStream(); 
      mBitmap = BitmapFactory.decodeStream(new FlushedInputStream (in)); 
      //mBitmap.recycle(); 

     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     this.g = mBitmap; 
     return mBitmap; 
    } 

    public Bitmap myBitmap() { 
     Bitmap fg; 
     fg = (Bitmap) g; 

     return fg; 
    } 

    static class FlushedInputStream extends FilterInputStream { 
     public FlushedInputStream(InputStream inputStream) { 
      super(inputStream); 
     } 

     @Override 
     public long skip(long n) throws IOException { 
      long totalBytesSkipped = 0L; 
      while (totalBytesSkipped < n) { 
       long bytesSkipped = in.skip(n - totalBytesSkipped); 
       if (bytesSkipped == 0L) { 
        int b = read(); 
        if (b < 0) { 
         break; // we reached EOF 
        } else { 
         bytesSkipped = 1; // we read one byte 
        } 
       } 
       totalBytesSkipped += bytesSkipped; 
      } 
      return totalBytesSkipped; 
     } 
    } 

} 

編輯

我已經修改DownloadImageTask.java按照此代碼做一些緩存:https://stackoverflow.com/a/7730547

但我似乎有這方面的問題:

if (!(this.mImageView.getTag().toString()).equals(this.mUrl)) { 
      /* The path is not same. This means that this 
       image view is handled by some other async task. 
       We don't do anything and return. */ 
      return; 
     } 

由於if ...行,應用程序總是崩潰。這讓人非常沮喪。我需要幫助。請幫幫我。下面是修改後的DownloadImageTask.Java

import java.io.FilterInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.net.MalformedURLException; 

import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.os.AsyncTask; 
import android.view.View; 
import android.widget.ImageView; 

public class DownloadImageTask extends AsyncTask<Void, Void, Bitmap> { 
    public Bitmap g; 
    private String mUrl; 
    private ImageView mImageView = null; 

    public DownloadImageTask(String Url, ImageView imageView) { 


     mUrl = Url; 
     this.mImageView = imageView; 




    } 

    protected void onPostExecute(Bitmap result) { 
     super.onPostExecute(result); 

     /* 
     if (result != null) { 
      mImageView.setImageBitmap(result); 

     } 
     */ 
     if (!(this.mImageView.getTag().toString()).equals(this.mUrl)) { 
      /* The path is not same. This means that this 
       image view is handled by some other async task. 
       We don't do anything and return. */ 
      return; 
     } 

     if(result != null && mImageView != null){ 
      mImageView.setVisibility(View.VISIBLE); 
      mImageView.setImageBitmap(result); 
      mImageView.setTag(this.mUrl); 
     }else{ 
      mImageView.setVisibility(View.GONE); 
     } 


    } 

    protected Bitmap doInBackground(Void... params) { 

     Bitmap bitmap = getBitmap(mUrl); 
     return bitmap; 




    } 

    public Bitmap getBitmap(String imageUrl) { 


     Bitmap mBitmap = null; 
     try { 

      /*URL newurl = new URL(imageUrl); 
      mBitmap = BitmapFactory.decodeStream(newurl.openConnection() .getInputStream()); */ 
      //mImageView.setImageBitmap(mBitmap); 

      /* 
      URL url = new URL(imageUrl); 
      HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
      InputStream is = conn.getInputStream(); 
      mBitmap = BitmapFactory.decodeStream(new FlushedInputStream(is));*/ 


      InputStream in = new java.net.URL(imageUrl).openStream(); 
      mBitmap = BitmapFactory.decodeStream(new FlushedInputStream (in)); 


      //this.mImageView.setTag(this.mUrl); 
      //mBitmap.recycle(); 

     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     this.g = mBitmap; 

      return mBitmap; 

    } 

    public Bitmap myBitmap() { 
     Bitmap fg; 
     fg = (Bitmap) g; 

     return fg; 
    } 

    static class FlushedInputStream extends FilterInputStream { 
     public FlushedInputStream(InputStream inputStream) { 
      super(inputStream); 
     } 

     @Override 
     public long skip(long n) throws IOException { 
      long totalBytesSkipped = 0L; 
      while (totalBytesSkipped < n) { 
       long bytesSkipped = in.skip(n - totalBytesSkipped); 
       if (bytesSkipped == 0L) { 
        int b = read(); 
        if (b < 0) { 
         break; // we reached EOF 
        } else { 
         bytesSkipped = 1; // we read one byte 
        } 
       } 
       totalBytesSkipped += bytesSkipped; 
      } 
      return totalBytesSkipped; 
     } 
    } 






} 
+0

大家好......雖然我收到1個響應,我需要的東西是沿着我做的就行了。 – OneNation 2013-04-12 04:12:24

回答

0

無需實現這一點使用AsyncTask手動和這樣你可以使用一個緩存庫。 Android的查詢是一個相當不錯:http://code.google.com/p/android-query/

要與Android查詢載入圖片您可以使用您的ListView適配器的getView方法中下面的代碼:

AQuery _aq = new AQuery(mActivity); 
_aq.id(R.id.icon).image("IMAGE_URI_TO_LOAD"); 

這應該更換holder.icon.setImageBitmap(bitmapList[position]);電話。

這將在imageview中加載,緩存和顯示來自Uri的圖像。如果圖像已被緩存,它將自動從緩存加載。

有關如何使用這個庫的圖像加載,你可以點擊這裏瞭解更多信息:http://code.google.com/p/android-query/wiki/ImageLoading

+0

仍然沒有解決我的問題。 mContext有錯誤。我用'this','Adapter.this','Adapter.java'代替,仍然有問題... – OneNation 2013-04-12 04:23:16

+0

我編輯了答案。嘗試使用毫安而不是mContext – 2013-04-12 09:33:24

+0

無法正常工作。我不知道... @ __ @順便說一句,我更新了我的帖子在DownloadImageTask.java上。我無法讓它工作。 – OneNation 2013-04-12 09:50:28