2014-08-31 82 views
0

我是Android開發的初學者。我嘗試使用JSON創建ListView。我有隨機加載的ImageView的問題。這是我的MoviesAdapter.java:android - ViewHolder ImageView隨機加載

package com.dianagung.json; 

    import java.io.InputStream; 
    import java.util.ArrayList; 

    import android.content.Context; 
    import android.graphics.Bitmap; 
    import android.graphics.BitmapFactory; 
    import android.os.AsyncTask; 
    import android.util.Log; 
    import android.view.LayoutInflater; 
    import android.view.View; 
    import android.view.ViewGroup; 
    import android.widget.ArrayAdapter; 
    import android.widget.ImageView; 
    import android.widget.TextView; 

public class MoviesAdapter extends ArrayAdapter<Movies> { 

    ArrayList<Movies> ArrayListMovies; 
    int Resource; 
    Context context; 
    LayoutInflater vi; 
    ViewHolder holder; 


    public MoviesAdapter(Context context, int resource, 
      ArrayList<Movies> objects) { 
     super(context, resource, objects); 
     ArrayListMovies = objects; 
     Resource = resource; 
     this.context = context; 

     vi = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

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

     View v = convertView; 
     if (v == null) { 
      holder = new ViewHolder(); 

      v = vi.inflate(Resource, null); 
      holder.mImage = (ImageView) v.findViewById(R.id.mImage); 
      holder.mTitle = (TextView) v.findViewById(R.id.mTitle); 
      holder.mDate = (TextView) v.findViewById(R.id.mDate); 
      v.setTag(holder); 
     } else { 
      holder = (ViewHolder) v.getTag(); 
     } 

     holder.mImage.setImageResource(R.drawable.ic_launcher); 
     new DownloadImage(holder.mImage).execute(ArrayListMovies.get(position) 
       .getImage()); 
     holder.mTitle.setText(ArrayListMovies.get(position).getTitle()); 
     holder.mDate.setText(ArrayListMovies.get(position).getDate()); 
     return v; 
    } 

    static class ViewHolder { 
     public ImageView mImage; 
     public TextView mTitle; 
     public TextView mDate; 
    } 

    // Download Image Task 
    private class DownloadImage extends AsyncTask<String, Void, Bitmap> { 
     ImageView bmImage; 

     public DownloadImage(ImageView bmImage) { 
      this.bmImage = bmImage; 
     } 

     protected Bitmap doInBackground(String... urls) { 
      String urldisplay = urls[0]; 
      Bitmap mIcon = null; 
      try { 
       InputStream in = new java.net.URL(urldisplay).openStream(); 
       mIcon = BitmapFactory.decodeStream(in); 
      } catch (Exception e) { 
       Log.e("Error", e.getMessage()); 
       e.printStackTrace(); 
      } 
      return mIcon; 
     } 

     protected void onPostExecute(Bitmap result) { 
      if (result != null) { 
       Bitmap bmp2 = Bitmap.createScaledBitmap(result, 80, 80, true); 
       bmImage.setImageBitmap(bmp2); 
      } 
     } 

    } 

} 

任何幫助,將不勝感激。提前致謝。

+0

您的ImageViews加載隨機圖像的原因是,當用戶滾動瀏覽列表時,並非所有圖像都會完成加載並且您正在回收視圖。這意味着您執行的任務將附加到不再顯示相同圖像的ImageView。您需要確保在用戶滾動時取消任務,以便任務不會完成,甚至無法執行,除非仍然需要。你可以在這裏看到這個例子:http://stackoverflow.com/questions/12414648/large-listview-containing-images-in-android/12532386#12532386 – MCeley 2014-08-31 04:26:10

回答

0

添加此行holder.mImage.setImageBitmap(null);之前打電話給new DownloadImage(holder.mImage).execute(ArrayListMovies.get(position) .getImage());它會做的工作。

順便說一句,如果存在大量的位圖,您可能會使用NOSTRA13's library進行異步圖像加載,所以您沒有使用正確的方法來解碼位圖,如果有大量位圖,可能會遇到OutOfMemory Exceptions

+0

它不工作 – emir 2017-01-04 12:34:22