Пользовательский адаптер списка повторяет записи

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

Итак, это мой макет элемента:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="60dip" >  

    <ImageView android:id="@+id/list_item_image"
        android:layout_height="wrap_content"
        android:padding="2dip" 
        android:layout_gravity="center_vertical|center_horizontal" 
        android:layout_width="50dip"/>  
    <TextView android:id="@+id/list_item" 
        android:layout_height="fill_parent"
        android:textSize="25sp"
        android:layout_width="fill_parent" 
        android:ellipsize="marquee" 
        android:gravity="center_vertical" 
        android:padding="5dip" >
    </TextView>
</LinearLayout>

Я попытался изменить layout_height на LinearLayout, но столкнулся с некоторыми проблемами. Если я сохраняю высоту wrap_content, мой список отображается с правильными записями — пункт 1, пункт 2, пункт 3 и так далее до пункта 12. Однако, если я изменю высоту на 60dip, записи повторяются после шестой записи (Я получаю пункт 1, пункт 2, пункт 3, пункт 4, пункт 5, пункт 6, пункт 1, пункт 2, пункт 3...). Если я продолжу увеличивать его, записи будут повторяться чаще.

Это фрагмент из ListAdapter, где я установил элементы списка:

public View getView(int position, View convertView, ViewGroup parent) {

    LinearLayout layout;

    if (convertView == null){
         layout = (LinearLayout) LayoutInflater.from(mContext).inflate(R.layout.items_list_item, parent, false);

         TextView title = (TextView) layout.findViewById(R.id.list_item);
         title.setText(menuItems[position]);

         ImageView icon = (ImageView) layout.findViewById(R.id.list_item_image);
         int logo = getResources().getIdentifier(menuIcons[position], "drawable", getPackageName());
         icon.setImageResource(logo);

    } else {
         layout = (LinearLayout) convertView;
    }
  return layout;
}

Кто-нибудь еще сталкивался с этой проблемой? Я не понимаю, что происходит, так как я думал, что это должен быть прямой захват из массива.

РЕДАКТИРОВАТЬ: включен весь мой метод getView(). Простите за некрасивый способ получения иконок, я еще не разобрался,


person Zarah    schedule 17.08.2010    source источник


Ответы (2)


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

public View getView(int position, View convertView, ViewGroup parent){
   if(convertView == null){
      convertView = mInflater.inflate(R.layout.my_listitem_row, parent, false);
   }

   //...fill the TextViews on your layout

   return convertView;
}

Получение значков должно быть таким же простым, как

icon.setImageResource(R.drawable.my_icon); //the res/drawable folder has the my_icon.png file
person Juri    schedule 17.08.2010
comment
Выложил весь код выше. Похоже, перемещение настроек TextView и ImageView за пределы if-else помогло. Спасибо! - person Zarah; 17.08.2010
comment
Изменил мой пост, добавив, как вы можете установить свои значки. - person Juri; 17.08.2010
comment
Спасибо Юрий! Что касается значка, я не знаю, как поместить R.drawable.* в массив int в strings.xml, чтобы я мог просто вытащить содержимое, как я сделал для строк (String[] menuContents = getResources( ).getStringArray(R.array.menu_items);). Я думаю, что это совсем другая тема, и кто-то может нас пожурить. :D - person Zarah; 17.08.2010

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

Взгляните на эту сессию из Google I/ O 2010 для множества действительно полезной информации о том, как использовать ListViews (и дополнительные адаптеры). Он содержит множество советов и советов о том, как лучше всего их использовать. Если у вас есть время, посмотрите видео, если нет слайды.

Удачи :)

person matto1990    schedule 17.08.2010
comment
Это заставляет меня хотеть поехать в следующем году. Думаю, что обычно это середина моего экзаменационного периода :( - person matto1990; 17.08.2010
comment
Спасибо за ссылку, посмотрю позже. - person Zarah; 17.08.2010