Wie man mit ListView umgeht, klicken Sie in Android


141

Wie höre ich mir ein Klickereignis in einer ListView an?

Das habe ich jetzt

ListView list = (ListView)findViewById(R.id.ListView01);  
...  
list.setAdapter(adapter);  

Wenn ich folgendes mache

list.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {  
   public void onItemSelected(AdapterView parentView, View childView, 
                                                         int position, long id) 
   {  
       setDetail(position);  
   }

   public void onNothingSelected(AdapterView parentView) {  

   }  
});  

Das scheint beim Klicken nichts zu bewirken.
Und all diese Codes leben in einer Klasse, die die Aktivität erweitert.

Antworten:


182

Verwenden Sie in Ihrer Listenansicht setOnItemClickListener


Danke David. Geezzz, ich habe setOnClickListener und setOnItemSelectedListener ausprobiert, aber das Lesen von setOnItemClickListener verpasst. Danke, Tee
teepusink

Ich tat das gleiche wie Teepusink: D
Shereef Marzouk

Wie senden Sie dann Daten an diese Detailansicht? (Wie YouTube durch Klicken zu einem Video)
Sauron

Zuerst muss die Klasse den Klick-Listener implementieren: implementiert OnItemClickListener Dann setzen Sie einen Listener auf ListView yourList.setOnItemclickListener (this); Und schließlich erstellen Sie die clic-Methode: @Override public void onItemClick (AdapterView <?> Übergeordnet, Ansichtsansicht, int-Position, lange ID) {Toast.makeText (MainActivity.this, "Sie haben auf" geklickt "+ Länder [+ Position], Toast.LENGTH_SHORT) .show (); }
Bourax Webmaster

88

Angenommen, das ListView-Objekt ist lv, gehen Sie wie folgt vor:

lv.setClickable(true);
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {

  @Override
  public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {

    Object o = lv.getItemAtPosition(position);
    /* write you handling code like...
    String st = "sdcard/";
    File f = new File(st+o.toString());
    // do whatever u want to do with 'f' File object
    */  
  }
});

1
lvist innen nicht zugänglich onItemClick. Was ist ein guter Weg, um das zu umgehen?
Shinjin

1
@shinjin Mach es endgültig. final ListView lv = (ListView) findViewById(R.id.your_list_view);
Lekensteyn

Sauberer Weg:Object o = ((ListView)arg0).getItemAtPosition(position);
JimmyB

Hier ist der Link zur Dokumentation: developer.android.com/reference/android/widget/…
trinity420

42

Sie müssen die aufgeblasene Ansicht "Klickbar" und "Klickereignisse abhören können" in Ihrer Methode der Adapterklasse getView () festlegen.

convertView = mInflater.inflate(R.layout.list_item_text, null);
convertView.setClickable(true);
convertView.setOnClickListener(myClickListener);

und deklarieren Sie den Klick-Listener in Ihrer ListActivity wie folgt:

public OnClickListener myClickListener = new OnClickListener() {
public void onClick(View v) {
                 //code to be written to handle the click event
    }
};

Dies gilt nur, wenn Sie den Adapter durch Erweitern von BaseAdapter anpassen.

Weitere Informationen finden Sie in ANDROID_SDK / samples / ApiDemos / src / com / example / android / apis / view / List14.java


danke Vijay ich habe ein
Klickproblem auf der Aufblasansicht, das

Dies bestimmt jedoch nicht, auf welches Element geklickt wird, was es für eine Liste mehr oder weniger nutzlos macht. Richtig?
Farm Strauß

Sie können das Tag auf convertView setzen und dasselbe in onClick überprüfen. Mit dem Tag, auf das geklickt wird, kann identifiziert werden ...
Vijay C

Ich habe eine elegantere Lösung als ein Tag in Ihrem Adapter gefunden. Speichern Sie eine setOnClickListener-Referenz und rufen Sie sie mit der onClick (View v) -Methode auf. dann kann die Aktivität das Ereignis mit der Position empfangen.
Jocelyn

Ihre onClick-Methode ist falsch. Es sollte onItemClick sein (AdapterView <?> Parent, View view, int position, long id)
IgorGanapolsky

17

Die beiden Antworten vor mir sind richtig - Sie können verwenden OnItemClickListener.

Es ist gut zu wissen, dass der Unterschied zwischen OnItemClickListenerund OnItemSelectedListener, obwohl er subtil klingt, tatsächlich erheblich ist, da die Auswahl und der Fokus von Elementen mit dem Berührungsmodus Ihres Geräts zusammenhängen AdapterView.

Standardmäßig gibt es im Touch-Modus keine Auswahl und keinen Fokus. Sie können einen Blick hier für weitere Informationen zu diesem Thema.


8

Diese Lösung ist wirklich minimalistisch und bringt Ihren Code nicht durcheinander.

Weisen Sie in Ihrer list_item.xml (NICHT listView!) Das Attribut android: onClick folgendermaßen zu :

<RelativeLayout android:onClick="onClickDoSomething">

und rufen Sie dann in Ihrer Aktivität diese Methode auf:

public void onClickDoSomething(View view) {
   // the view is the line you have clicked on
}

Gute Lösung, aber es gibt keine Möglichkeit, die Position des angeklickten Elements zu ermitteln
Bilal Şimşek

@ BilalŞimşek Ich war lange Zeit nicht mehr auf Android, aber wenn das vieweinige Metadaten haben kann, könnte es der Weg sein, um die Position zu bekommen.
Amio.io

6

Du musst setOnItemClickListenerjemanden benutzen , sagte.
Der Code sollte folgendermaßen aussehen:

listView.setOnItemClickListener(new OnItemClickListener() {
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        // When clicked, show a toast with the TextView text or do whatever you need.
        Toast.makeText(getApplicationContext(), ((TextView) view).getText(), Toast.LENGTH_SHORT).show();
    }
});

5

Zunächst muss die Klasse den Klick-Listener implementieren:

implements OnItemClickListener

Stellen Sie dann einen Listener auf die ListView ein

yourList.setOnItemclickListener(this);

Und schließlich erstellen Sie die Clic-Methode:

@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
Toast.makeText(MainActivity.this, "You Clicked at " +countries[+ position], Toast.LENGTH_SHORT).show();
}

Sie können einen Blick und Downloadcode nehmen hier


3

Verwenden Sie in Ihrer Aktivität die API setOnItemClickListener (). Es folgt das Beispiel.

listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){

@Override
public void onItemClick(AdapterView<> parent, View view, int position, long id)
{
     // your code here.
}

});

1

Fügen Sie in Kotlin Ihrer Listenansicht einen Listener hinzu, der so einfach wie Java ist

your_listview.setOnItemClickListener { parent, view, position, id ->   

    Toast.makeText(this, position, Toast.LENGTH_SHORT).show()

 }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.