Ниже приведен фрагмент кода со ListView. Я добавил emptyView и headerView. Добавление headerView приводит к увеличению позиции в onItemClick на единицу.
Таким образом, без headerView первый элемент списка будет иметь позицию 0, с headerView позиция первого элемента списка будет 1!
Это вызывает ошибки в моем адаптере, например, при вызове getItem () и использовании некоторых других методов, см. Ниже. Странная вещь: в методе адаптера getView () первый элемент списка запрашивается с позицией 0, даже если добавлен headerView !!
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
ListView list = (ListView) viewSwitcher.findViewById(R.id.list);
View emptyView = viewSwitcher.findViewById(R.id.empty);
list.setEmptyView(emptyView);
View sectionHeading = inflater.inflate(R.layout.heading, list, false);
TextView sectionHeadingTextView = (TextView) sectionHeading.findViewById(R.id.headingText);
sectionHeadingTextView.setText(headerText);
list.addHeaderView(sectionHeading);
list.setAdapter(listAdapter);
list.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
listAdapter.getItem(position);
//Do something with it
}
});
}
Некоторые методы адаптера:
@Override
public int getViewTypeCount() {
return TYPE_COUNT;
}
@Override
public int getItemViewType(int position) {
return (position < items.size()) ? ITEM_NORMAL : ITEM_ADVANCED;
}
@Override
public Product getItem(int position) {
return items.get(position);
}
@Override
public boolean areAllItemsEnabled() {
return false;
}
@Override
public boolean isEnabled(int position) {
return (position < items.size());
}
Это нормальное поведение при добавлении headerView ?? А как побороть проблемы в моем адаптере?
Ответы:
Я просто наткнулся на эту проблему , и лучший способ , кажется, использовать
ListView.getItemAtPosition(position)
вместоListAdapter.getItem(position)
какListView
версия счета для заголовков, а именно: -Вместо этого сделайте это:
источник
onItemClick
дает вамparent
причину. Вы можете использоватьparent.getItemAtPosition(position)
AdapterView
также просто переходит в добавленный listAdapter.return (adapter == null || position < 0) ? null : adapter.getItem(position);
Если вас не интересует щелчок по заголовку, вычтите количество просмотров заголовка из позиции, чтобы получить позицию для вашего адаптера:
источник
Если вы добавите заголовок к a
ListView
, он станет первым элементом в списке. Вы можете компенсировать это путем переопределенияgetCount()
вернуть один пункт меньше, но убедитесь , что вы обрабатыватьgetItem()
,getItemId()
и так далее , как заголовок будет элемент в положении 0.источник
ListView.getHeaderViewsCount()
При реализации
AdapterView.OnItemClickListener
мы просто вычитаем заголовки из позиции.источник
Нет необходимости менять какой-либо код. Просто используйте приведенный ниже код.
источник
Не используйте свой адаптер, используйте «украшенный» адаптер от getAdapter.
источник
Одно из решений - сопоставить идентификатор с index. В основном заставьте id вернуть индекс в списке, и прослушиватель кликов будет делать:
источник
Привет, мы можем решить эту проблему таким образом, сначала вы создаете представление заголовка, после вставки в свой список и на последнем шаге не удается установить setOnClickListener. это работает для меня. любые отзывы приветствуются
источник
Не для того, чтобы добавить много нового, чего не добавил @Ramesh, кроме дополнительного контекста:
источник
Используйте getSelectedItemPosition (). Возвращает позицию текущего выбранного элемента в наборе данных адаптера. Этому методу не нужно беспокоиться о размере верхних или нижних колонтитулов.
источник
Это может помочь кому-то, улучшив ответ Farid_z и Филиппа, мы можем правильно применить setItemChecked и setTitle с чем-то вроде этого
источник