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

1

Я пытаюсь создать 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, мой список будет отображаться с правильными записями - Item 1, Item 2, Item 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;
}

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

EDIT: включил весь мой метод getView(). Простите уродливый способ получить значки, я еще не понял,

Теги:
listview
listadapter

2 ответа

6
Лучший ответ

Вы не разместили достаточно кода, но в своем адаптере 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
  • 0
    Выложил весь код выше. Похоже на перемещение настройки TextView и ImageView за пределы if-else . Спасибо!
  • 0
    Изменено мое сообщение, чтобы включить, как вы можете установить свои иконки.
Показать ещё 1 комментарий
2

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

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

Удачи:)

  • 0
    +1 за ссылку на сессию ввода / вывода. Отличная сессия.
  • 0
    Это заставляет меня хотеть поехать в следующем году. Думаю, это в середине моего экзаменационного периода, как обычно :(
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню