Ich habe ListView
mit benutzerdefinierten Adapter
, die View
an ListView
auf folgende Weise liefert:
public View getView(int position, View convertView, ViewGroup parent)
{
RelativeLayout.LayoutParams lineParams;
RelativeLayout line=new RelativeLayout(context);
TextView tv=new TextView(context);
tv.setText("Text in postion="+i);
lineParams=new RelativeLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
lineParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
line.addView(tv, lineParams);
lineParams.addRule(RelativeLayout.CENTER_IN_PARENT);
//checkbox
CheckBox checkBox=new CheckBox(context);
lineParams=new RelativeLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
lineParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
lineParams.addRule(RelativeLayout.CENTER_IN_PARENT);
line.addView(checkBox, lineParams);
return line;
}
Und irgendwo in ListView
gibt es setOnItemClickListener()
, die Element-Klick-Ereignisse abfangen soll. Mein Problem ist, dass ich immer, wenn ich versuche, ein Kontrollkästchen zu item hinzuzufügen, keine Antwort von meiner ListView
erhält. Wenn ich CheckBox
oder eine andere Button
überspringe, funktioniert es.
Ich bin wirklich fest mit diesem Problem beschäftigt, ich habe alle Arten von Layouts, Ausrichten, Einwickeln und so weiter ausprobiert - nutzlos. Sieht aus wie CheckBox
ListView
Elementklickereignisse.
Irgendwelche Ideen, wie man sie überwinden kann?
fügen Sie diese Zeile einfach in die Elementansicht ein, anstatt die Listenansicht selbst
Android:focusable="false"
mehr Details dazu finden Sie in Benutzerdefinierte ListView kann nicht auf Elemente klicken
Wenn sich innerhalb des Listenelements ImageButtons befinden, müssen Sie Folgendes hinzufügen:
Android:descendantFocusability="blocksDescendants"
auf das Element des Stammlistenelements [z. B. das Stammlayout].
Dann müssen Sie in jedem ImageButton im Listenelement Folgendes hinzufügen:
Android:focusableInTouchMode="true"
Das funktionierte für mich - aber ich verwendete ImageButtons, nicht die Standardschaltfläche.
Ich habe auch mit dem gleichen Problem konfrontiert, das ich versucht habe, Android:focusable="false"
auf listview zu setzen, aber es funktioniert nicht. Dann füge ich dies dem listview-Element hinzu Fügen Sie Android:focusable="false"
zur Umschaltfläche und Listenansicht für Elementklicklistener hinzu, um die Arbeit wieder aufzunehmen
Fügen Sie Ihrer listView folgende Zeile hinzu
Android:choiceMode="singleChoice"
oder stellen Sie sicher, dass Sie die folgenden Zeilen in Ihre Layout-Textfelder setzen
Android:focusable="false"
Android:focusableInTouchMode="false"
Android:clickable="false"
Sie können in Erwägung ziehen, Ihr OnTouchEvent in Ihrem Listenansichtselement zu schreiben und das entsprechende TouchEvent an Ihre untergeordnete Ansicht, die Schaltfläche, zu senden.
Ich hatte auch das Problem eines Buttons in meiner ListView. Das Einstellen des Fokus auf "false" für alle Objekte in meinem Adapter funktionierte leider nicht für mich.
Ich habe jetzt eine Problemumgehung.
Erstellen Sie in Ihrem Adapter einen OnClickListener für die Schaltfläche (oder ein anderes anklickbares Objekt), falls Sie dies noch nicht getan haben. In diesem OnClickListener rufen Sie den OnItemClickListener selbst auf.
public void onClick(View v) {
mOnItemClickListener.setOnItemClick(mListView, v, vPos, vId);
}
Dies bedeutet, dass Sie Ihrem Adapter Zugriff auf die übergeordnete ListView und den OnItemClickListener gewähren müssen.
Nun, ich weiß, dass keine der oben genannten Lösungen funktionieren wird. Ich habe versucht, die XML-Attribute zu ändern, aber das klappt nicht, aber ich habe es auf eine neue Art und Weise implementiert ...
Erstellen Sie eine Schnittstelle CheckBoxOnCheckListener
mit der Methode onCheckBoxChecked
und übergeben Sie die erforderlichen Parameter, implementieren Sie die Schnittstelle CheckBoxOnCheckListener
in Ihrer Aktivität oder Fragment , die listView enthält.
Als Nächstes deklarieren Sie in Ihrem Adapter eine mListener
als CheckBoxOnCheckListener
und übergeben diesen als Parameter an den Konstruktor des Adapters von fragment/activity
, wandeln Sie ihn in CheckBoxOnCheckListener
und weisen Sie mListener
zu.
Als Nächstes setzen Sie mListener
als itemView.onClick
oder CheckBox.onCheckCheckedListener
und onCheckChanged
Methodenaufruf mListener.onCheckBoxChecked
.
Das ist es. Es wird auf jeden Fall funktionieren, es hat für mich funktioniert. Für Code nur pm.