GridView не ведет себя правильно - PullRequest
1 голос
/ 10 ноября 2011

У меня есть следующая проблема:

У меня есть gridview, который работает от ImageAdapter, который загружает изображения из Интернета и предоставляет их в GridView. Это прекрасно работает, однако есть одна проблема, которая меня бесит. Проблема в том, что первые 10 изображений, которые должны заполнить экран, загружаются правильно. 11-е, хотя показано пустым и по какой-то неизвестной причине, кажется, взяты из convertView напрямую. Изображение 12 отображается правильно, и все изображения ниже являются пустыми, даже если они имеют действительные URL-адреса для загрузки.

Это мой ImageAdapter

package com.wm.grid;

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

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;

public class ImageAdapter extends BaseAdapter {
   private Context mContext;
   public String[] mThumbIds;
   public Bitmap[] bmp;
   public Bitmap bitmapPlaceholder;
    public ImageAdapter(Context c,String[] m) {
        mContext = c;
        mThumbIds = m;
        initBitmapListWithPlaceholders();
    }
    public void initBitmapListWithPlaceholders(){
        int count = mThumbIds.length;
        bmp = new Bitmap[count];
        for(int i=0;i<count;i++){
             bmp[i]=bitmapPlaceholder;
        }
    }
    public int getCount() {     
        return mThumbIds.length;
    }

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

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

    // create a new ImageView for each item referenced by the Adapter
    public View getView(int position, View convertView, ViewGroup parent) {
        Log.v("POSITION","P"+position+convertView);
        ImageView imageView;
        if (convertView == null) {  // if it's not recycled, initialize some attributes
            imageView = new ImageView(mContext);
            imageView.setLayoutParams(new GridView.LayoutParams(210, 150));
            imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
            imageView.setPadding(1, 1, 1, 1);
            Bitmap bm = getBitmap(setURL(mThumbIds[position]),position);
            bmp[position] = bm;
            imageView.setImageBitmap(bm);


        } else {
            imageView = (ImageView) convertView;
            imageView.setImageBitmap(bmp[position]);
        }
        //imageView.setImageBitmap(getBitmap(setURL(mThumbIds[position])));
        //imageView.setImageResource(mThumbIds[position]);
        return imageView;
    }
    private URL setURL (String urls){
       try{
           URL urli = new URL(urls);
           return urli;
       }
       catch (MalformedURLException e) {
           e.printStackTrace();
       }
    return null;
    }
    private Bitmap getBitmap (URL url,int position){

       try{
           Log.v("POSITION","Loading "+position+url);
           Bitmap bm = BitmapFactory.decodeStream((InputStream) url.getContent());
           return bm;
       }
  catch (IOException e) {
        e.printStackTrace();
       }
    return null;
    }
 /*   public Integer[] AddItems(Integer[] a){
        final Integer[] aThumbIds;
        final int i;
        aThumbIds = a;
        Integer[] a2 = new Integer[mThumbIds.length + aThumbIds.length];
        System.arraycopy(mThumbIds, 0, a2, 0, mThumbIds.length);
        System.arraycopy(aThumbIds, 0, a2, mThumbIds.length, aThumbIds.length);
        mThumbIds = a2;
        return mThumbIds;
    }
    */
}

Файл GridActivity.java не предоставляется, поскольку он содержит только массив строк (ссылок), которые передаются в адаптер.

main.xml - это только сетка, поэтому я не думаю, что это как-то связано.

Более того, у меня есть вывод некоторых точек отладки, и это очень странно.

11-10 14:55:28.700: V/POSITION(12936): Loading 0 //Loading the first image
11-10 14:55:28.785: V/POSITION(12936): P0android.widget.ImageView@40536450//First image found in ConvertView (why ? it is already loaded ... :()
11-10 14:55:28.790: V/POSITION(12936): P0android.widget.ImageView@40536450//Same thing
11-10 14:55:28.790: V/POSITION(12936): P1null//All OK convertView is null load image from web
11-10 14:55:28.790: V/POSITION(12936): Loading 1
11-10 14:55:28.895: V/POSITION(12936): P2null
11-10 14:55:28.895: V/POSITION(12936): Loading 2
11-10 14:55:29.070: V/POSITION(12936): P3null
11-10 14:55:29.070: V/POSITION(12936): Loading 3
11-10 14:55:29.175: V/POSITION(12936): P4null
11-10 14:55:29.175: V/POSITION(12936): Loading 4
11-10 14:55:29.290: V/POSITION(12936): P5null
11-10 14:55:29.290: V/POSITION(12936): Loading 5
11-10 14:55:29.420: V/POSITION(12936): P6null
11-10 14:55:29.420: V/POSITION(12936): Loading 6
11-10 14:55:29.500: V/POSITION(12936): P7null
11-10 14:55:29.505: V/POSITION(12936): Loading 7
11-10 14:55:29.580: V/POSITION(12936): P8null
11-10 14:55:29.580: V/POSITION(12936): Loading 8
11-10 14:55:29.675: V/POSITION(12936): P9null
11-10 14:55:29.675: V/POSITION(12936): Loading 9
11-10 14:55:29.800: V/POSITION(12936): P0null//again !? P0 was loaded in first place why does it try to load it again ?!... and it is even NULL ?!
11-10 14:55:29.800: V/POSITION(12936): Loading 0
11-10 14:55:29.910: V/POSITION(12936): P0android.widget.ImageView@40547ea0
=====================
11-10 15:02:00.435: V/POSITION(12936): P10android.widget.ImageView@40547ea0//Now image 10 was NEVER loaded before why the heck it is in the convertView !?
11-10 15:02:00.435: V/POSITION(12936): P11null//Image 11 is loaded correctly.
11-10 15:02:00.435: V/POSITION(12936): Loading 11
=====================(Scrolling down is even more questionable)
11-10 15:03:10.740: V/POSITION(12936): P12android.widget.ImageView@405505f0//Where the heck convertView found this image (never loaded)
11-10 15:03:10.740: V/POSITION(12936): P13android.widget.ImageView@40536450//Same applies for this one.

Результатом вышеизложенного является то, что изображения 10, 12 и 13 и все изображения ниже являются пустыми

Любые подсказки приветствуются. Заранее большое спасибо.

РЕДАКТИРОВАТЬ: Еще одна вещь. Если я изменю код следующим образом:

if (convertView == null) {  // if it's not recycled, initialize some attributes
            imageView = new ImageView(mContext);
            imageView.setLayoutParams(new GridView.LayoutParams(210, 150));
            imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
            imageView.setPadding(1, 1, 1, 1);
            Bitmap bm = getBitmap(setURL(mThumbIds[position]),position);
            bmp[position] = bm;
            imageView.setImageBitmap(bm);


        } else {
            imageView = (ImageView) convertView;
            imageView.setImageBitmap(getBitmap(setURL(mThumbIds[position]),position));//DOWNLOAD IMAGE AGAIN
        }

Изображения отображаются правильно, однако приложение работает два медленно, потому что оно всегда загружает изображение.

1 Ответ

0 голосов
/ 31 мая 2012

попробуйте реализовать кеш в вашем проекте вот это ссылка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...