Раздувать много просмотров в списке

У меня есть listView и я хочу расширить каждый элемент, когда вы нажимаете на него. У меня есть следующий код для этого. Я работаю, раздувая ViewStub.

Работает нормально. То есть, когда я нажимаю на элемент списка, он действительно раздувается. Все идет нормально.

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

@override
public void onListItemClick(ListView l, View v, int position, long id) {


    ListView list = getListView();
    int start = list.getFirstVisiblePosition();
    for (int i = start, j = list.getLastVisiblePosition(); i <= j; i++) {
        Cursor item = (Cursor) list.getItemAtPosition(i);

        if (id == item.getLong(item.getColumnIndex(ItemColumns._ID))) {
            View view = list.getChildAt(i - start);

            ViewStub stub = (ViewStub) view.findViewById(R.id.stub);
            if (stub != null) {
                stub.inflate();

            }       
        }
    }
}

Любая помощь будет высоко ценится!

1 ответ

Android повторно использует представления в ListView, Вот почему существует convertView в getView(..) метод вашего Adapter, Этот SO пост объясняет: ListView многократного использования представлений, когда... Я не хочу, чтобы в основном, что вам нужно сделать, это держать Set предметов, которые в настоящее время расширены, и в вашем getView(..) Метод поиска:

if(mExpanded.contains(getItem(position))) {
  //show expansion
} else {
  //hide expansion
}

тогда в вашем onListItemClick Метод, который вы хотите добавить следующее:

if(!mExpanded.remove(getListView().getItem(position))) {
   mExpanded.add(getListView().getItem(position));
}

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

Другие вопросы по тегам