Unten finden Sie ein Code-Snippet mit einer ListView. Ich habe eine leere Ansicht und eine Header-Ansicht hinzugefügt. Durch Hinzufügen der Header-Ansicht wird die Position im onItemClick um eins erhöht.
Ohne die HeaderView hätte das erste Listenelement also die Position 0, mit der HeaderView wäre die Position des ersten Listenelements 1!
Dies führt zu Fehlern in meinem Adapter, z. B. beim Aufrufen von getItem () und bei Verwendung anderer Methoden (siehe unten). Seltsame Sache: In der getView () -Methode des Adapters wird das erste Listenelement mit Position 0 angefordert, auch wenn die headerView hinzugefügt wird !!
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
}
});
}
Einige Adaptermethoden:
@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());
}
Ist dies das normale Verhalten beim Hinzufügen einer Header-Ansicht? Und wie kann ich die Probleme in meinem Adapter lösen?
quelle
Antworten:
Ich bin gerade auf dieses Problem gestoßen und der beste Weg scheint, das
ListView.getItemAtPosition(position)
anstelle vonListAdapter.getItem(position)
alsListView
Versionskonten für die Header zu verwenden, dh: -Tun Sie dies stattdessen:
quelle
onItemClick
gibt Ihnen eineparent
aus einem Grund. Sie können verwendenparent.getItemAtPosition(position)
AdapterView
wird auch nur an den hinzugefügten listAdapter weitergegeben.return (adapter == null || position < 0) ? null : adapter.getItem(position);
Wenn Sie sich nicht für das Klicken auf die Kopfzeile interessieren, subtrahieren Sie die Anzahl der Kopfzeilenansichten von der Position, um die Position für Ihren Adapter zu erhalten:
quelle
Wenn Sie eine Kopfzeile zu einer hinzufügen
ListView
, wird dies zum ersten Element in der Liste. Man könnte dies kompensieren , indem die übergeordnetegetCount()
ein Element weniger zurück, aber stellen Sie sicher , den GriffgetItem()
,getItemId()
und so weiter , wie der Header 0 das Element in der Lage sein würde.quelle
ListView.getHeaderViewsCount()
Bei der Implementierung
AdapterView.OnItemClickListener
subtrahieren wir nur die Header von der Position.quelle
Sie müssen keinen Code ändern. Verwenden Sie einfach den folgenden Code.
quelle
Verwenden Sie Ihren Adapter nicht, sondern den 'dekorierten' Adapter von getAdapter.
quelle
Eine Lösung hierfür besteht darin, die ID dem Index zuzuordnen. Grundsätzlich soll id den Index in der Liste zurückgeben und der Klick-Listener würde Folgendes tun:
quelle
Hallo, wir können dies auf diese Weise beheben. Zuerst erstellen Sie Ihre Header-Ansicht, nachdem Sie Ihre Liste eingefügt haben und der letzte Schritt den setOnClickListener nicht ausführen kann. es funktioniert für mich. Feedback ist willkommen
quelle
Nicht viel Neues hinzuzufügen, das @Ramesh nicht hinzugefügt hat, sondern einen zusätzlichen Kontext:
quelle
Verwenden Sie getSelectedItemPosition (). Geben Sie die Position des aktuell ausgewählten Elements im Datensatz des Adapters zurück. Diese Methode muss sich nicht um die Größe der Kopf- oder Fußzeilen kümmern.
quelle
Dies könnte jemandem helfen und die Antwort von Farid_z und Philipp verbessern. Wir können setItemChecked und setTitle mit so etwas korrekt anwenden
quelle