wake-up-neo.com

ListView OnItemClickListener reagiert nicht?

Ich habe überall nach einer Lösung dafür gesucht, aber ich kann nicht herausfinden, wie ich es implementieren kann. Meine OnItemClickListener wurde in meinen ListView-Zeilen irgendwie deaktiviert, da ich im Zeilenlayout eine ImageButton habe, die den Fokus übernimmt. Es gab zahlreiche Fragen, die ich gefunden habe, aber keine davon hat mich irgendwohin gebracht.

Ich habe diese Frage überprüft, aber ich konnte nicht wirklich Köpfe oder Schwänze daraus machen. Ich brauche nur einen Weg, um die Zeilen anklickbar zu machen, damit ich erkennen kann, wann eine Zeile gedrückt wird. Langes Drücken und Fokus funktionieren gut.

44
Kleptine

Fügen Sie statt eines OnItemClickListener - einen OnClickListener zu jeder der von Ihrem Adapter zurückgegebenen Ansichten hinzu. Sie müssen setItemsCanFocus verwenden, um Ihre Liste einzurichten:

ListView list = (ListView) findViewById(R.id.myList);
list.setAdapter(new DoubleClickAdapter(this));
list.setItemsCanFocus(true);

und dann in Ihrer Adapter getView ergibt sich eine anklickbare Zeile. Es wird angenommen, dass sich die Schaltfläche in der aufgeblasenen XML befindet.

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View view = View.inflate(context, R.layout.cell, null);
    view.setClickable(true);
    view.setFocusable(true);
    view.setBackgroundResource(Android.R.drawable.menuitem_background);
    view.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            new AlertDialog.Builder(context).setTitle("touched").show();
        }

    });
    return view;
}
60
jqpubliq

setze dein ImageButton Attribut:

Android:focusable="false"

Weil AbsListView.onTouchEventchild.hasFocusable() überprüft. 

51
meizilp

Ich habe die folgende Lösung auf den SDK-Leveln 8 und 16 getestet.

In getView()

setFocusable(false);
setClickable(false);

anstatt sie in der getView() des Adapters auf true zu setzen, wird die ursprüngliche Frage erfüllt und bedeutet, dass ein OnItemClickListener aufgerufen wird, sofern in getView() kein OnClickListener festgelegt ist.

Ich gehe davon aus, dass alles, was Sie in der OnClickListener einer Ansicht tun können, Sie genauso einfach in der ListView einer OnItemClickListener tun können. (setOnClickListener in einer Ansicht legt implizit fest, dass auf die Ansicht geklickt werden kann, wodurch anscheinend verhindert wird, dass der entsprechende ListView der OnItemClickListener aufgerufen wird.)

Das Verhalten entspricht dem visuellen Status von ImageButton, wenn das Element gedrückt oder über das Element gefahren wird.

Die Lösung ist insofern eine kleine Illusion, als es sich bei dem gedrückten Listenelement nicht um das ImageButton selbst handelt. Wenn die Schaltfläche also nicht das gesamte Listenelement belegt, spiegelt das Klicken auf eine andere Stelle im Element weiterhin den Zeichenstatus der Schaltfläche wider . Gleiches gilt für den Fokus. Das könnte einen Preis wert sein.

10
JulianSymes

Das wird definitiv funktionieren. Fügen Sie dies der Layoutdefinition hinzu.

Android:descendantFocusability="blocksDescendants" 

Die Lösung gefunden hier

6
Kapil Raju

am besten tun Sie dies:

  Android:focusable="false"
  Android:focusableInTouchMode="false"

legen Sie diese Eigenschaften für Imagebutton fest und versuchen Sie es mit ..__ 

5
silentkratos

Eine Alternative zum Festlegen eines OnClickListener für jede Ansicht besteht darin, KEIN ImageButton zu verwenden. Verwenden Sie stattdessen ein ImageView. Die ImageView kann immer noch Ereignisse an eine OnClickListener senden und übernimmt nicht den Fokus.

5
humbleCoder

Für meine Version dieses Problems bestand das Problem darin, dass ich mein TextView-Objekt auf Android:inputType="textMultiLine" gesetzt hatte. Als ich diese Zeile entfernte, war das Problem der Liste nicht anklickbar. Sieht aus wie ein böser kleiner Fehler.

Außerdem kann ich die Android:minLines/Android:maxLines-Eigenschaften ohne Probleme verwenden, daher ist dies kein großes Problem. Nur nicht die Lösung, die ich erwartet hatte.

4
greg7gkb

Als alternative Lösung, die für mich funktioniert hat, können Sie versuchen, Ihren Adapter um BaseAdapter zu erweitern (iso implementiert ListAdapter interface).

1
Pavel Dudka

Die folgende Zeile hat das Problem in meinem Projekt gelöst:

<TextView ... Android:textIsSelectable="false" />
1
hogi

Ich habe die Unterklasse ImageButton und setFocusable="false" in der Layoutdefinition für mich nicht funktioniert. Es wurde der Aufruf von setFocusable(false) im Konstruktor der Unterklasse behoben.

0
Lukas Novak

Setzen Sie diesen Code ImageView nextpage= (ImageView)findViewById(R.id.btnEdit); anstelle von ImageButton. Jetzt ist das Listenelement aktiv 

0
newb
    listView= (ListView) findViewById(R.id.listview_names);

   listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
       @Override
       public void onItemClick(AdapterView<?> parent, View view, int position, long id)
       {
           Toast.makeText(getBaseContext(),"Clicked Button",Toast.LENGTH_LONG).show();
           Log.d("h","clicked");

           /* Intent intent=new Intent(MainActivity.this,Display_data.class);

            intent.putExtra("NAME",n);
            intent.putExtra("AGE",a);
            startActivity(intent);*/
       }
   });

Ja, dieser Toast funktioniert nicht

0
Jay