wake-up-neo.com

OnItemClickListener funktioniert nicht mit ListView-Elementen, die die Schaltfläche enthalten

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 CheckBoxListView Elementklickereignisse.

Irgendwelche Ideen, wie man sie überwinden kann?

30
barmaley

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

51
Pratik

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.

16
dandev91

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 

13
Jaiprakash Soni

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"
1
GameBug

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.

0
Lion

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.

0

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.

0
Amit