Изображение (из Интернета) в Android ListView всегда перезагружается при появлении - PullRequest
2 голосов
/ 14 марта 2012

У меня есть ListView, который содержит список изображений, созданных по веб-ссылке (например, http://www...image.jpg) с помощью istruction:

Drawable d = LoadImageFromUrlWeb(TopTen_LinkImg);
imageTopTenView.setImageDrawable(d);

Я создал пользовательский ArrayAdapter (простой иоптимизирован с тем же результатом «держатель»).

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

Существуеткод, который присваивает ImageView постоянное изображение.

Код:

public View getView(int position, View convertView, ViewGroup parent)
    {
    LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View rowView = inflater.inflate(R.layout.row_top_ten, null);
    ImageView imageTopTenView = (ImageView)rowView.findViewById(R.id.imageTopTen);
    String TopTen = (String)ArrayDatiTopTen.get(position);
    String[] ArrayTopTen=TopTen.split(",");
    String TopTen_LinkImg=(String)ArrayTopTen[0];
    Drawable d = LoadImageFromUrlWeb(TopTen_LinkImg);
    imageTopTenView.setImageDrawable(d);
    return rowView;
    }

Возможно, решение заключается в заполнении списка с использованием программного кода:

ListView listView=(ListView) findViewById(R.id.listView);
...
listView.addView(...)
...

Решено

Я решил создать массив Drawable и заполнить этот массив изображением перед использованием в ArrayAdapter

// Define:
Drawable imageCache[]=new Drawable[100];

затем:

//loop to popolate array
imageCache[ct]=LoadImageFromUrlWeb(Link);

ВArrayList Я использую:

...
imageTopTenView.setImageDrawable(imageCache[position]);
return rowView;
...

От строки URL до нарисованного:

private Drawable LoadImageFromUrlWeb(String url)
    {
        try
        {
            url=url.replaceAll(" ", "%20");
            InputStream is = (InputStream) new URL(url).getContent();
            Drawable d = Drawable.createFromStream(is, "src name");
            return d;
        } 
        catch (Exception e)
        {
            Log.w("LoadImageFromUrlWeb",e.toString());
            return null;
        }
    }       

Ответы [ 2 ]

2 голосов
/ 14 марта 2012

Ответ Бретта - только половина решения, да, загрузка изображений должна выполняться асинхронно, но в конечном итоге вы будете снова и снова загружать одно и то же изображение каждый раз, когда прокручиваете просмотр списка из-за оптимизации просмотра списка.

Он повторно использует виды, поэтому даже если вы загрузили изображение и задали его, если вы прокрутите вниз несколько элементов, этот просмотр будет использоваться повторно, и изображение придется загружать снова при прокрутке вверх.

Чтобы предотвратить это, вам также понадобится кэширование изображений. См. этот пост в блоге разработчика Android.

К счастью, код в блоге обеспечивает как асинхронную загрузку изображений, так и их кэширование. Исходный код можно получить по здесь

( Примечание. Вам потребуется внести небольшие изменения в исходный код )

Изменить строку 58 с

private Mode mode = Mode.NO_ASYNC_TASK;

до

private Mode mode = Mode.CORRECT;
1 голос
/ 14 марта 2012

Если я правильно понимаю вашу дилемму, вам нужно будет загружать чертеж в фоновом режиме, а не синхронно, и вставлять вместо него пустое / локальное изображение заполнителя. Как только у вас будет загружено правильное изображение, вы можете заменить на него заполнитель.

...