Изображения ListView отображаются только при прокрутке (и исчезают). Объяснение того, как это работает - PullRequest
1 голос
/ 15 февраля 2011

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

У меня есть файл rolo.xml для каждого элемента списка

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 
android:id="@+id/RelativeLayout01" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent"
android:background="#FFFFFF" 
xmlns:android="http://schemas.android.com/apk/res/android">

<ImageView 
android:layout_height="50sp" 
android:layout_width="50sp" 
android:layout_alignParentLeft="true" 
android:id="@+id/ImageIcon"/>

<TextView 
android:text="@+id/TextView01" 
android:id="@+id/TitleText"
android:textStyle="bold"
android:textSize="20sp" 
android:layout_toRightOf="@id/ImageIcon"
android:layout_alignParentTop="true"
android:layout_width="fill_parent" 
android:layout_height="wrap_content"
android:background="#FFFFFF"
android:textColor="#333333"
/>

<TextView 
android:text="@+id/TextView02" 
android:id="@+id/DescriptionText" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content"
android:textSize="12sp"
android:background="#FFFFFF"
android:textColor="#333333"
android:layout_toRightOf="@id/ImageIcon"
android:layout_below="@id/TitleText"
android:layout_alignWithParentIfMissing="true"
/>

</RelativeLayout>

Мой ListViewAdapter имеет следующий getView (с ViewWrapper)

public View getView(int position, View convertView, ViewGroup parent)
    {
        View row=convertView;
        ViewWrapper wrapper=null;
        Activity activity=(Activity)getContext();

        RssItem item=getItem(position);

        if (row == null) {

            LayoutInflater inflater=activity.getLayoutInflater();
        row=inflater.inflate(R.layout.row,null);
        wrapper=new ViewWrapper(row);
        row.setTag(wrapper);
    }
        else
        {
            wrapper=(ViewWrapper)row.getTag();
        }

        wrapper.getTitle().setText(item.getTitle());
        String cleaned=item.getDescription().replaceAll("\\<.*?\\>", "");
        int Long=cleaned.length();
        if (Long<=100)
        {
            wrapper.getDescription().setText(cleaned);
        }
        else wrapper.getDescription().setText(cleaned.substring(0, 50)+"...");

        String laurl=item.getImageUrl();

        if (laurl!="") 
        { 
            Drawable cachedImage = imageloader.loadDrawable(laurl);
            wrapper.getImage().setImageDrawable(cachedImage);
        }
        else 
        {
            wrapper.getImage().setImageResource(R.drawable.icon);
        }

        return row;

    }

    class ViewWrapper {

        private View base;
        private TextView title=null;
        private TextView description=null;
        private ImageView icono=null;

        ViewWrapper (View base) {
            this.base=base;
        }

        public TextView getTitle() {
            if (title==null) {
                title=(TextView)base.findViewById(R.id.TitleText);
            }
            return title;
        }

        public TextView getDescription() {
            if (description==null) {
                description=(TextView)base.findViewById(R.id.DescriptionText);
            }
            return description;
        }

        public ImageView getImage() {
            if (icono==null) {
                icono=(ImageView)base.findViewById(R.id.ImageIcon);
            }
            return icono;
        }       

    }

И я получаю изображения через следующий класс.

public class ImageThreadLoader  {


    //GlobalCache
    private HashMap<String, SoftReference<Drawable>> imagecache;

    public ImageThreadLoader()
    {
        imagecache= new HashMap<String, SoftReference<Drawable>>();
    }

    public Drawable loadDrawable(final String imageurl) //,final ImageCallback imageCallback)
    {
        if (imagecache.containsKey(imageurl))
        {
            SoftReference<Drawable> softReference=imagecache.get(imageurl);
            Drawable drawable=softReference.get();
            if (drawable != null) {
                return drawable;
            }
        }

        new Thread() {
            @Override
            public void run() {
                Drawable drawable = loadImageFromUrl(imageurl);
                imagecache.put(imageurl, new SoftReference<Drawable>(drawable));
            }
        }.start();
        return null;
    }

    public static Drawable loadImageFromUrl(String url) {
        InputStream inputStream;
        try {
            inputStream = new URL(url).openStream();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return Drawable.createFromStream(inputStream, "src");
    }

}

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

Я думаю, что проблема в том, что я действительно не понимаю, как все работает ..

Спасибо за внимание

Ответы [ 2 ]

3 голосов
/ 13 июля 2011

У меня была такая же проблема сегодня. То, что не объяснено ни в документации, ни в видео, опубликованном Pavandroid, заключается в том, что вам нужно устанавливать состояние определенных свойств, а не полагаться на значения по умолчанию этих состояний, как они установлены в файле макета.

Например, в моем приложении изображение отображается в строке в зависимости от состояния данных для этой строки. По умолчанию в моем файле макета изображение будет отображаться. Когда вызывается getView и изображение не должно отображаться, я делаю изображение невидимым с помощью

If (hideImage)
  someImage.setVisibility(View.INVISIBLE);

Логично предположить, что если hideImage имеет значение false, изображение будет отображаться, но при прокрутке оно в конечном итоге исчезнет. Вместо того, чтобы полагаться на файл макета по умолчанию, я должен был установить видимость explicity:

If (hideImage)
  someImage.setVisibility(View.INVISIBLE);
else
  someImage.setVisibility(View.VISIBLE);

Это исправило проблему.

1 голос
/ 15 февраля 2011

Могу взглянуть на это: http://www.youtube.com/watch?v=wDBM6wVEO70

Это сеанс от Google I / O полностью о ListViews.

...