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.

teepusink
quelle

Antworten:

182

Verwenden Sie in Ihrer Listenansicht setOnItemClickListener

David Hedlund
quelle
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
    */  
  }
});
Aditya Mehta
quelle
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

Vijay C.
quelle
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.

Dimitar Dimitrov
quelle
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
}
Amio.io
quelle
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();
    }
});
Shudy
quelle
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

Bourax Webmaster
quelle
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.
}

});
Amey Haldankar
quelle
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()

 }
Allen
quelle