Android-Klicken Sie auf den Listeneintrag prüft, falsche checkbox
Ich habe eine custom ListView durch die Erweiterung SimpleCursorAdapter.
Das Ergebnis ist BILD + CheckedTextView (Text + Links).
Wenn ich lange auf ein Element, funktioniert auch alles Prima - ich bekomme die richtige ID und die details des angeklickten Elements.
Tritt das problem auf, wenn ich versuche, markieren Sie ein Element als überprüft, überprüft dabei aber die falsche checkbox.
Zum Beispiel: ich habe 9 Punkte auf meiner Liste, sortiert 1-9. wenn ich auf listItem-1, das Kontrollkästchen in Zeile 9 wird geprüft. wenn ich auf Punkt 4, können Sie das Feld in Zeile 6 wird geprüft, wenn ich auf der mittleren Linie, es wird geprüft.
Klar bin ich etwas fehlt hier 🙂
Erinnern Sie sich daran, wenn ich lange auf die Zeile klicken (Kontextmenü öffnet sich), alles funktioniert Super.
Dies ist dem Hörer:
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
CheckedTextView markedItem = (CheckedTextView) view.findViewById(R.id.btitle);
if (!markedItem.isChecked()) {
markedItem.setChecked(true);
} else {
markedItem.setChecked(false);
}
}
});
Jede Hilfe dankbar!
Lassen Sie mich wissen, Wenn Sie mich brauchen, um mehr zu schreiben code.
Danke!
btw, Wenn ich auf mehr als eine... die PARTY geht weiter... keine offensichtliche Ordnung...
EDIT: der Adapter-code
public class ImageCursorAdapter extends SimpleCursorAdapter {
private Cursor c;
private Context context;
private String url;
private TextView bUrl;
public ImageCursorAdapter(Context context, int layout, Cursor c,
String[] from, int[] to) {
super(context, layout, c, from, to);
this.c = c;
this.context = context;
}
public View getView(int pos, View inView, ViewGroup parent) {
View v = inView;
if (v == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = inflater.inflate(R.layout.image_list, null);
}
this.c.moveToPosition(pos);
final TextView bTitle = (TextView) v.findViewById(R.id.btitle);
String bookmark = this.c.getString(this.c.getColumnIndex(Browser.BookmarkColumns.TITLE));
byte[] favicon = this.c.getBlob(this.c.getColumnIndex(Browser.BookmarkColumns.FAVICON));
if (favicon != null) {
ImageView iv = (ImageView) v.findViewById(R.id.bimage);
iv.setImageBitmap(BitmapFactory.decodeByteArray(favicon, 0, favicon.length));
}
bTitle.setText(bookmark);
return (v);
}
}
- Zeigen Sie uns Ihre adapter
- bearbeitete Frage. Danke.
- sind Sie auf der Anmeldung den Wert position in den Hörer? Haben Sie andere Zuhörer?
- Nein 🙁 und ich habe noch ein listener für einen button, aber es ist nicht mit der listView. aber ich fügte hinzu, ein toast, nur um zu sehen, was für eine position angeklickt wird und zu meiner überraschung, es ist die richtige position. wenn ich klickte auf listItem 2 es zeigte sich, position 2 und so weiter... komisch. Wenn Sie erwähnten es ich es erwartet zeigen die falsche position...
- Die Möglichkeit, dass der Checkboxen ist irgendwie in umgekehrter Reihenfolge zu der Liste?
- Vielleicht post-layout code für die Zeile layouts (image_list.xml) als gut?
- Ich sehe nicht ein besonderes problem, aber ich Wette, es hat zu tun mit ListView-Ansichten wiederverwenden. Auch, warum sind Sie aufblasen Dinge yoruself in getView, statt super Griff der Ansicht Schöpfung?
- Mayra vielen Dank für die Beantwortung noch einmal! 🙂 Ich werde überprüfen, Ihre beiden Vorschläge.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mayra ist Recht - das problem hat zu tun mit der Art und Weise der ListView ist die Wiederverwendung von Ihren Ansichten. Es ist nicht so, wenn gibt es 9 Instanzen der
CheckedTextView
- Objekt, eine-per-view. Stattdessen gibt es eine einzige, die wiederverwendet wird in allen Zeilen. Somit können Sie sich nicht darauf verlassen, dass die CheckedTextView Objekt, halten den Zustand, ob ein Element aktiviert ist. Sie müssen einige zusätzliche Daten, die Struktur zu halten, ob eine gegebene Zeile wird überprüft, Zum Beispiel,Wo die
ith
element ist true, wennn derith
Zeile die geprüft werden soll. Dann in Ihrem itemClickListener:Dann in Ihrem anzeigen-code:
Dies sollte Ihr problem lösen. Ein alternativer Ansatz wäre, nach der Logik, ob die Zeile markiert ist oder nicht in das domain-Objekt, das der Zeile entspricht. Das wäre meine Präferenz.