Раздувать много просмотров в списке
У меня есть 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
чтобы быть удаленным, то вы хотите добавить его...