асинхронная загрузка изображений в gridview - PullRequest
0 голосов
/ 12 мая 2011

Я загружаю изображения в gridviev asynchronusly. Но мое gridview отображает только одно изображение в последней ячейке gridview. Мой класс адаптера и класс asynchronus приведены ниже, спасибо.

Класс адаптера:

class OrderAdapter extends ArrayAdapter<String>
{   
    LayoutInflater inflater;

    String name3[];
    public OrderAdapter(Context context,int resource,LayoutInflater inflater,String name2[])
    {
        super(context, resource,R.id.img,name2);
        this.inflater=inflater;
        this.name3=name2;
    }
    public View getView(int position, View convertView, ViewGroup parent)
    {  
        View row=inflater.inflate(R.layout.row,parent,false);
      final  ImageView img=(ImageView)row.findViewById(R.id.img);
        String imgurl=name3[position];
        Log.e("urlchandan",name3[position]);
        AsyncImageLoaderv asyncImageLoaderv=new AsyncImageLoaderv();
        Bitmap cachedImage = asyncImageLoaderv.loadDrawable(imgurl, new AsyncImageLoaderv.ImageCallback() 
            {
            public void imageLoaded(Bitmap imageDrawable, String imageUrl) {
            img.setImageBitmap(imageDrawable);

            }
            });
        img.setImageBitmap(cachedImage);     

        return row;
    }

}

Асинхронный класс

public class AsyncImageLoaderv {
    private HashMap<String, SoftReference<Bitmap>> imageCache;

    public AsyncImageLoaderv() {
        imageCache = new HashMap<String, SoftReference<Bitmap>>();
    }

    public Bitmap loadDrawable(final String imageUrl, final ImageCallback imageCallback) {
        if (imageCache.containsKey(imageUrl)) {
            SoftReference<Bitmap> softReference = imageCache.get(imageUrl);
            Bitmap drawable = softReference.get();
            if (drawable != null) {
                return drawable;
            }
        }
        final Handler handler = new Handler() {
            @Override
                public void handleMessage(Message message) {
                    imageCallback.imageLoaded((Bitmap) message.obj, imageUrl);
                }
        };
        new Thread() {
            @Override
                public void run() {
                    try{
                        Log.d("ur",imageUrl);
                        Bitmap drawable = loadImageFromUrl(imageUrl);
                        imageCache.put(imageUrl, new SoftReference<Bitmap>(drawable));
                        Message message = handler.obtainMessage(0, drawable);
                        handler.sendMessage(message);
                    }catch(Exception e){Log.e("thread stellent",e.toString());}
                }
        }.start();
        return null;
    }


    public static Bitmap loadImageFromUrl(String url) {
            InputStream inputStream;Bitmap b;
            try {
                    inputStream = (InputStream) new URL(url).getContent();
                    BitmapFactory.Options bpo=  new BitmapFactory.Options();
                    bpo.inSampleSize=2;
                   b=BitmapFactory.decodeStream(new PatchInputStream(inputStream), null,bpo );
                    return  b;
            } catch (IOException e) {
                    throw new RuntimeException(e);
                }
//return null;
    }

    public interface ImageCallback {
        public void imageLoaded(Bitmap imageBitmap, String imageUrl);
    }
}

Ответы [ 2 ]

1 голос
/ 12 мая 2011

Вы не можете делать это так, как пытаетесь. Вам нужно, чтобы ваш асинхронный загрузчик сохранял полученное изображение в некоторой структуре данных, к которой ваш адаптер может получить доступ по позиции (например, список, хэш-карта и т. Д.). Ваш getView() должен просто вытащить изображение из правильного положения. Ваш асинхронный загрузчик заполнит структуру данных и выполнит команду notifyDataSetChanged(), чтобы перерисовать список с новым загруженным изображением.

0 голосов
/ 15 июня 2011

Я получил решение, сделав ImageView IMG в Adatper Inflater как окончательный, потому что он избегает изображения для отображения в одной ячейке в gridview. И мои изображения были большого размера и получили ошибку, декодер возвращает ложь, и эта ошибка решается с помощью другого класса

-

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

public class PatchInputStream extends FilterInputStream {
      public PatchInputStream(InputStream in) {
        super(in);
      }
      public long skip(long n) throws IOException {
        long m = 0L;
        while (m < n) {
          long _m = in.skip(n-m);
          if (_m == 0L) break;
          m += _m;
        }
        return m;
      }
    }

этот класс используется в AsyncImageLoaderv, указанном выше.

  b=BitmapFactory.decodeStream(new PatchInputStream(inputStream), null,bpo );
...