Come gestire il clic di ListView in Android


141

Come ascolto l'evento click su un ListView?

Questo è quello che ho adesso

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

Quando faccio quanto segue

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

   public void onNothingSelected(AdapterView parentView) {  

   }  
});  

Questo non sembra fare nulla al clic.
E tutto quel codice vive all'interno di una classe che estende l'attività.

Risposte:


182

Nella visualizzazione elenco, utilizzare setOnItemClickListener


Grazie David. Accidenti, ho provato setOnClickListener e setOnItemSelectedListener ma non ho letto setOnItemClickListener. Grazie, Tee
teepusink, il

ho fatto lo stesso di teepusink: D
Shereef Marzouk il

Come si inviano quindi i dati a quella vista dettagliata? (Come YouTube che fa clic su un video)
Sauron,

Innanzitutto, la classe deve implementare l'ascoltatore clic: implementa OnItemClickListener Quindi imposta un listener su ListView yourList.setOnItemclickListener (this); E infine, crea il metodo clic: @Override public void onItemClick (AdapterView <?> Parent, View view, int position, long id) {Toast.makeText (MainActivity.this, "You Clickked at" + children [+ position], Toast.LENGTH_SHORT) .Show (); }
webmaster bourax,

88

Supponiamo che l'oggetto ListView sia LV, effettuare le seguenti-

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
lvnon è accessibile all'interno onItemClick. Qual è un bel modo per aggirare questo?
shinjin,

1
@shinjin Renderlo definitivo. final ListView lv = (ListView) findViewById(R.id.your_list_view);
Lekensteyn,

Modo pulito:Object o = ((ListView)arg0).getItemAtPosition(position);
JimmyB


42

È necessario impostare la vista gonfiata "Cliccabile" e "in grado di ascoltare gli eventi clic" nel metodo getView () della classe dell'adattatore.

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

e dichiarare il listener di clic in ListActivity come segue,

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

Questo vale solo quando si personalizza l'adattatore estendendo BaseAdapter.

Fai riferimento a ANDROID_SDK / samples / ApiDemos / src / com / example / android / apis / view / List14.java per maggiori dettagli


grazie Vijay ho
riscontrato un

Ma questo non determina quale oggetto viene cliccato, il che lo rende più o meno inutile per un elenco? Corretta?
Struzzo di fattoria,

puoi impostare il tag su convertView e controllare lo stesso in onClick .. usando il tag quale elemento su cui si fa clic può essere identificato ...
Vijay C

Ho trovato una soluzione più elegante di un tag nel tuo adattatore e memorizza un riferimento setOnClickListener e lo chiama sul metodo onClick (Visualizza v). quindi l'attività può ricevere l'evento con la posizione.
jocelyn,

Il tuo metodo onClick è sbagliato. Dovrebbe essere onItemClick (AdapterView <?> Parent, View view, int position, long id)
IgorGanapolsky

17

Le due risposte prima delle mie sono corrette: puoi usarle OnItemClickListener.

È bene notare che la differenza tra OnItemClickListenere OnItemSelectedListener, sebbene sembri sottile, è in realtà significativa, poiché la selezione e la messa a fuoco degli oggetti sono correlate alla modalità touch del tuo AdapterView.

Per impostazione predefinita, in modalità touch, non c'è selezione e messa a fuoco. Puoi dare un'occhiata qui per ulteriori informazioni sull'argomento.


8

Questa soluzione è davvero minimalista e non confonde il tuo codice.

Nel tuo list_item.xml (NON listView!) Assegna l'attributo android: onClicca in questo modo:

<RelativeLayout android:onClick="onClickDoSomething">

e quindi nella tua attività chiama questo metodo:

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

buona soluzione ma, non c'è modo di ottenere la posizione dell'oggetto cliccato
Bilal Şimşek

@ BilalŞimşek Da molto tempo non uso Android ma se viewposso avere dei metadati, potrebbe essere il modo in cui ottenere la posizione.
Amio.io,

6

Devi usare setOnItemClickListenerqualcuno ha detto.
Il codice dovrebbe essere così:

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

Innanzitutto, la classe deve implementare l'ascoltatore clic:

implements OnItemClickListener

Quindi impostare un listener su ListView

yourList.setOnItemclickListener(this);

E infine, crea il metodo clic:

@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();
}

puoi dare un'occhiata e scaricare il codice qui


3

Usa setOnItemClickListener () api nella tua attività. Di seguito è riportato il campione.

listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){

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

});

1

In Kotlin, aggiungi un ascoltatore al tuo elenco Visualizza semplice come Java

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

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

 }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.