Poniżej znajduje się fragment kodu z ListView. Dodałem emptyView i headerView. Dodanie headerView powoduje zwiększenie pozycji w onItemClick o jeden.
Tak więc bez headerView pierwszy element listy miałby pozycję 0, z nagłówkiem headerView pozycja pierwszego elementu listy byłaby równa 1!
Powoduje to błędy w moim adapterze, np. Podczas wywoływania getItem () i używania innych metod, patrz poniżej. Dziwna rzecz: w metodzie getView () adaptera żądany jest pierwszy element listy z pozycją 0, nawet jeśli dodano 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
}
});
}
Niektóre metody adaptera:
@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());
}
Czy jest to normalne zachowanie podczas dodawania headerView? A jak rozwiązać problemy w moim adapterze?
android
listview
listadapter
d1rk
źródło
źródło
Odpowiedzi:
Właśnie natknąłem się na ten problem i wydaje się, że najlepszym sposobem jest użycie
ListView.getItemAtPosition(position)
zamiastListAdapter.getItem(position)
jakoListView
wersji uwzględniającej nagłówki, tj .: -Zrób to zamiast tego:
źródło
onItemClick
nieparent
bez powodu. Możesz użyćparent.getItemAtPosition(position)
AdapterView
również przechodzi do dodanego listAdapter.return (adapter == null || position < 0) ? null : adapter.getItem(position);
Jeśli nie zależy Ci na kliknięciu w nagłówek, odejmij liczbę widoków nagłówka od pozycji, aby uzyskać pozycję dla karty:
źródło
Jeśli dodasz nagłówek do pozycji,
ListView
która stanie się pierwszą pozycją na liście. Można to skompensować poprzez nadpisaniegetCount()
wrócić jeden element mniej, ale upewnij się obsłużyćgetItem()
,getItemId()
i tak dalej jako nagłówek będzie pozycja w pozycji 0.źródło
ListView.getHeaderViewsCount()
Podczas implementacji
AdapterView.OnItemClickListener
po prostu odejmujemy nagłówki od pozycji.źródło
Nie musisz zmieniać żadnego kodu. Po prostu użyj poniższego kodu.
źródło
Nie używaj swojego adaptera, użyj „dekorowanego” adaptera z getAdapter.
źródło
Jednym z rozwiązań jest mapowanie identyfikatora do indeksu. Zasadniczo spraw, aby identyfikator zwrócił indeks na liście, a odbiornik kliknięć zrobiłby:
źródło
Cześć, możemy rozwiązać ten problem w ten sposób, że najpierw utworzysz widok nagłówka, po wstrzyknięciu do listy, a ostatnim krokiem nie będzie setOnClickListener. to działa dla mnie. wszelkie uwagi mile widziane
źródło
Nie żeby dodać wiele nowego, czego nie dodał @Ramesh, ale dodatkowy kontekst:
źródło
Use getSelectedItemPosition () Zwraca pozycję aktualnie wybranej pozycji w zestawie danych adaptera. Ta metoda nie musi martwić się o rozmiar nagłówków ani stopek.
źródło
Może to komuś pomóc, poprawiając odpowiedź Farid_z i Philippa, możemy poprawnie zastosować setItemChecked i setTitle z czymś takim
źródło