it-swarm.com.de

ListView und Schaltflächen in ListView

Ich möchte eine Button in der ListView..__ anzeigen. Das Ziel sollte sein, auf die ListView-Zeile oder auf die Schaltfläche zu klicken.

Klicken Sie auf die Zeile, in der weitere Informationen angezeigt werden. Klicken Sie auf die Schaltfläche, die unter den weiteren Schaltflächen angezeigt wird.

Das gleiche wie die GMAIL-App.

Auf der rechten Seite befindet sich ein Kontrollkästchen. Nachdem Sie auf das Kontrollkästchen unten geklickt haben, wird die Schaltflächenleiste angezeigt.

Mein Problem ist nach dem Einfügen der Schaltfläche in die ListView, die Schaltfläche ist nicht anklickbar ..__ Wenn ich die LinearLayout über die Schaltfläche llButton.setClickable() hinzufüge, funktioniert es. Aber nur der Knopf. Die ListView selbst reagiert nicht mehr auf Klicks!

Ich habe dieses Beispiel ausprobiert.

Das gleiche Problem wie oben ...

57
chrisonline

Wenn Sie einen benutzerdefinierten Adapter verwenden, funktioniert der Button-Klick innerhalb einer ListView nicht. Daher sollten Sie den folgenden Code verwenden, um nach OnItemClickListener zu suchen.

listId.setOnItemClickListener(new AdapterView.OnItemClickListener() {
   public void onItemClick(AdapterView<?> list, View v, int pos, long id) {
      // Your code for item clicks
   }
});
8
Venky

Um dies klar zu stellen - und niemand scheint etwas so einfaches gesagt zu haben - während man in Verbindung mit der Listenansicht keinen fokussierbaren Button verwenden darf, gibt es dafür eine viel einfachere Lösung.

Die akzeptierte Antwort ist eine gegebene - Sie sollten dies immer tun, wenn Sie den Click-Listener für Listenelemente einstellen, so dass es dumm ist, dass OP das nicht wusste.

Wenn Sie ein XML-Layout als Listenelement verwenden, setzen Sie einfach die Schaltfläche mit dem folgenden Attribut. Dadurch wird das Listenelement ebenfalls anklickbar:

Android:focusable="false"

120
teh1

Fügen Sie die folgende Zeile zu Ihrem Listenelement-XML hinzu.

Android:descendantFocusability="blocksDescendants"

Dann wird Ihr Listeneintrag folgendermaßen aussehen:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:descendantFocusability="blocksDescendants"
Android:layout_height="wrap_content" >

    // Your layout objects here

</RelativeLayout>
18
Faruk Toptas

Um das Ereignis auszulösen, wenn entweder auf die Schaltfläche oder auf das Listenelement geklickt wird, können Sie Folgendes tun:

Sie behandeln nur beiItemClick:

mListView.setOnItemClickListener(new ListView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> a, View v, int i, long l) {
        // handle click here
    }
);

Im Adapter ändern Sie die Schaltfläche so, dass sie nicht anklickbar/fokussierbar ist (oder tun Sie dies in der XML-Datei)

public class MyAdapter extends BaseAdapter {
    ...
    public View getView(int position, View convertView, ViewGroup parent) {
        .....  
        Button btn = view.findViewById(R.id.button);
        btn.setFocusable(false);
        btn.setClickable(false);               
    }
}
7
beta

In meinem Fall musste ich dieses Attribut in die Listenansicht einfügen:

<ListView
...
Android:clickable="true"
...
</ListView>

Klicken Sie im Adapter einfach auf Listener in der Schaltflächenansicht.

wrapper.getButtonHi().setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            DebugUtils.logDebug("Clickeado :: "+ mContact.getUserId());
        }
});

Es ist wichtig, die Variablen endgültig festzulegen:

public View getRowView(final int position, View convertView, ViewGroup parent) {
    final BrowseContactItemWrapper wrapper;
    final UserModel mContact = lstContact.get(position);
    .....
}
0
Kokusho