2014-03-29 65 views
1

我試圖在列表視圖上顯示圖像。在一個單元中,我一次顯示4個圖像。當我不使用AsynkTask時,它工作,但不是平滑滾動。所以我試圖使用Asynktasks。但在我的實施中,它什麼也沒有顯示。ListView與AsyncTask不起作用

沒有的AsyncTask

public class LazyAdapter extends BaseAdapter { 

    private Activity activity; 
    private File[] data; 
    private LayoutInflater inflater = null; 

    public LazyAdapter(Activity a, File[] files) { 
     activity = a; 
     data=files; 
     inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    public int getCount() { 
     return data.length/4 + 1; 
    } 

    public Object getItem(int position) { 
     return position; 
    } 

    public long getItemId(int position) { 
     return position; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder; 
     if (convertView == null) { 
      convertView = inflater.inflate(R.layout.gallery_item, null); 
      holder = new ViewHolder(); 
      holder.icon1 = (ImageView) convertView.findViewById(R.id.imageView1); 
      holder.icon2 = (ImageView) convertView.findViewById(R.id.imageView2); 
      holder.icon3 = (ImageView) convertView.findViewById(R.id.imageView3); 
      holder.icon4 = (ImageView) convertView.findViewById(R.id.imageView4); 
      holder.position = position; 
      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 
     if(position >= 0){ 

          if(data.length > position * 4){ 
           holder.icon1.setImageURI(Uri.fromFile(data[position * 4])); 
          } 
          if(data.length > position * 4 + 1){ 
           holder.icon2.setImageURI(Uri.fromFile(data[position * 4 + 1])); 
          } 
          if(data.length > position * 4 + 2){ 
           holder.icon3.setImageURI(Uri.fromFile(data[position * 4 + 2])); 
          } 
          if(data.length > position * 4 + 3){ 
           holder.icon4.setImageURI(Uri.fromFile(data[position * 4 + 3])); 
          } 
     } 
     return convertView; 
    } 
} 

用的AsyncTask

public class LazyAdapter extends BaseAdapter { 

    private Activity activity; 
    private File[] data; 
    private LayoutInflater inflater = null; 

    public LazyAdapter(Activity a, File[] files) { 
     activity = a; 
     data=files; 
     inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    public int getCount() { 
     return data.length/4 + 1; 
    } 

    public Object getItem(int position) { 
     return position; 
    } 

    public long getItemId(int position) { 
     return position; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder; 
     if (convertView == null) { 
      convertView = inflater.inflate(R.layout.gallery_item, null); 
      holder = new ViewHolder(); 
      holder.icon1 = (ImageView) convertView.findViewById(R.id.imageView1); 
      holder.icon2 = (ImageView) convertView.findViewById(R.id.imageView2); 
      holder.icon3 = (ImageView) convertView.findViewById(R.id.imageView3); 
      holder.icon4 = (ImageView) convertView.findViewById(R.id.imageView4); 
      holder.position = position; 
      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 
     if(position >= 0){ 
      new AsyncTask<ViewHolder, Void, Void>(){ 
       @Override 
       protected Void doInBackground(ViewHolder... v) { 
        v[0].icon1.setImageURI(Uri.fromFile(data[v[0].position * 4])); 
        v[0].icon2.setImageURI(Uri.fromFile(data[v[0].position * 4 + 1])); 
        v[0].icon3.setImageURI(Uri.fromFile(data[v[0].position * 4 + 2])); 
        v[0].icon4.setImageURI(Uri.fromFile(data[v[0].position * 4 + 3])); 
        LazyAdapter.this.notifyDataSetChanged(); 
        return null; 
       } 
      }.execute(holder); 
     } 
     return convertView; 
    } 
} 
+0

我建議你使用https://github.com/nostra13/Android-Universal-Image-Loader圖像下載,如果可能的話,當然。這個庫將關注圖像加載,緩存和放置到您的視圖。它在列表視圖中非常出色。 –

+0

您可以簡單地使用'Universal-ImageLoader'類。 – Piyush

+0

這實際上並不是下載圖像。在這裏,只顯示'圖片'文件夾中的圖像 – enadun

回答

0

你可以很容易實現這種類型的列表...你會使用這樣的... 這裏也正在使用該asynctask但在這裏我下載並將該圖像存儲在緩存內存因此,它可以平滑滾動,你會像這樣嘗試....

公共類GalleryAdapter延伸BaseAdapter {

private String[] mImagePaths; 
private Activity mActivity; 
Context mContext; 
LayoutInflater mInflater; 
public static LruCache<Integer, Bitmap> sGalleryBitmap; 
public static int sCheckValue = 0; 
public static int sCheckingFlags[] = null; 

public GalleryAdapter(Activity a, String[] mGalleryString) { 
    super(); 
    this.mActivity = a; 
    this.mImagePaths = mGalleryString; 
    this.mContext = (Context) mActivity.getBaseContext(); 
    final int cacheSize = 20*1024*1024; 
    sGalleryBitmap = new LruCache<Integer, Bitmap>(cacheSize){   
     @Override 
     protected int sizeOf(Integer key, Bitmap bitmap) { 
      return bitmap.getByteCount(); 
     } 
    }; 
    mInflater = (LayoutInflater) mActivity 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    GalleryAdapter.sCheckingFlags = null; 
    GalleryAdapter.sCheckingFlags = new int[mImagePaths.length]; 
    sCheckValue = 0; 

} 

@Override 
public int getCount() { 
    return mImagePaths.length; 
} 

@Override 
public Object getItem(int position) { 

    return position; 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder; 
    convertView = null; 
    int n = 1; 
    convertView = mInflater.inflate(R.layout.gallery_support, null); 
    holder = new ViewHolder(); 
    holder.imgDisplay = (ImageView) convertView 
      .findViewById(R.id.galleryimage); 
    if (ViewerActivity.sResource == position) { 
     holder.imgDisplay.setBackgroundResource(R.drawable.redback); 
     n = 0; 
    } 
    holder.bar = (ProgressBar) convertView.findViewById(R.id.bar); 
    convertView.setTag(holder); 
    if (getBitmapFromMemCacheGallery(position)== null) { 
     load o1 = new load(position, holder.imgDisplay, holder.bar); 
     o1.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, 
       mImagePaths[position]); 
     if (position == 0) { 
      holder.imgDisplay.setBackgroundResource(R.drawable.redback); 
     } 

    } else { 
     if (GalleryAdapter.sCheckingFlags[position] == 1) { 
      holder.imgDisplay.setImageBitmap(getBitmapFromMemCacheGallery(position)); 
     } else { 
      holder.imgDisplay.setImageResource(R.drawable.galleryalart); 
     } 
    } 
    if (n == 1) { 
     convertView.setLayoutParams(new Gallery.LayoutParams(140, 140)); 
    } else { 
     convertView.setLayoutParams(new Gallery.LayoutParams(140, 140)); 
    } 
    return convertView; 
} 

public class ViewHolder { 
    ImageView imgDisplay; 
    ProgressBar bar; 
} 

private class load extends AsyncTask<String, Void, Bitmap> { 
    ImageView imageView; 
    ProgressBar bar; 
    int position; 

    public load(int position, ImageView imageView, ProgressBar bar) { 
     this.imageView = imageView; 
     this.bar = bar; 
     this.position = position; 
     this.imageView.setVisibility(View.GONE); 
     this.bar.setVisibility(View.VISIBLE); 
    } 

    @Override 
    protected Bitmap doInBackground(String... urls) { 
     String urldisplay = urls[0]; 

     Bitmap mIcon = null; 
     try { 
      URLConnection connection; 
      connection = new java.net.URL(urldisplay).openConnection(); 
      connection.setConnectTimeout(5000); 
      connection.setReadTimeout(5000); 
      InputStream in = connection.getInputStream(); 
      mIcon = BitmapFactory.decodeStream(in);//ViewerActivity.decodeSampledBitmapFromResource(in, 140,140); 
      if(mIcon!=null) 
      { 
       addBitmapToMemoryCacheGallery(position, mIcon); 
      }    
      in.close(); 
     } catch (Exception e) { 
      mIcon = null; 
      e.printStackTrace(); 
     } 
     return mIcon; 
    } 

    @Override 
    protected void onPostExecute(Bitmap result) { 
     if (result != null) { 
      imageView.setImageBitmap(result); 
      imageView.setLayoutParams(new RelativeLayout.LayoutParams(140, 
        140)); 
      imageView.setVisibility(View.VISIBLE); 
      bar.setVisibility(View.GONE);    
      GalleryAdapter.sCheckingFlags[position] = 1;     
     } else { 
      imageView.setBackgroundResource(R.drawable.galleryalart); 
      GalleryAdapter.sCheckingFlags[position] = 0; 
      imageView.setVisibility(View.VISIBLE); 
      bar.setVisibility(View.GONE); 
      Drawable myDrawable = mActivity.getResources().getDrawable(
        R.drawable.galleryalart); 
      Bitmap bitmap = ((BitmapDrawable) myDrawable).getBitmap(); 
      addBitmapToMemoryCacheGallery(position, bitmap); 
     } 
    } 

} 
@SuppressLint("NewApi") 
public static void addBitmapToMemoryCacheGallery(Integer position, Bitmap bitmap) { 
    if (getBitmapFromMemCacheGallery(position) == null) {   
     sGalleryBitmap.put(position, bitmap); 
    } 
} 

@SuppressLint("NewApi") 
public static Bitmap getBitmapFromMemCacheGallery(Integer imageKey) { 
    return sGalleryBitmap.get(imageKey); 
} 

}