Comment gérer le clic ListView dans Android

141

Comment écouter un événement de clic sur un ListView?

C'est ce que j'ai maintenant

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

Quand je fais ce qui suit

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

   public void onNothingSelected(AdapterView parentView) {  

   }  
});  

Cela ne semble rien faire en un clic.
Et tout ce code vit dans une classe qui étend Activity.

teepusink
la source

Réponses:

182

Dans votre vue de liste, utilisez setOnItemClickListener

David Hedlund
la source
Merci David. Geezzz, j'ai essayé setOnClickListener et setOnItemSelectedListener mais j'ai manqué la lecture de setOnItemClickListener. Merci, Tee
teepusink
j'ai fait la même chose que teepusink: D
Shereef Marzouk
Comment envoyez-vous ensuite des données à cette vue détaillée? (Comme YouTube en cliquant sur une vidéo)
Sauron
Tout d'abord, la classe doit implémenter l'écouteur de clic: implémente OnItemClickListener Ensuite, définissez un écouteur sur ListView yourList.setOnItemclickListener (this); Et enfin, créez la méthode 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 (); }
bourax webmaster
88

Supposons que l'objet ListView soit lv, procédez comme suit:

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
la source
1
lvn'est pas accessible à l'intérieur onItemClick. Quelle est une bonne façon de contourner cela?
shinjin
1
@shinjin Rendez-le définitif. final ListView lv = (ListView) findViewById(R.id.your_list_view);
Lekensteyn
Object o = ((ListView)arg0).getItemAtPosition(position);
Voie
Voici le lien vers la documentation: developer.android.com/reference/android/widget/…
trinity420
42

Vous devez définir la vue gonflée «cliquable» et «capable d'écouter les événements de clic» dans la méthode getView () de la classe d'adaptateur.

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

et déclarez l'écouteur de clic dans votre ListActivity comme suit,

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

Cela n'est vrai que lorsque vous personnalisez l'adaptateur en étendant BaseAdapter.

Reportez-vous à ANDROID_SDK / samples / ApiDemos / src / com / example / android / apis / view / List14.java pour plus de détails

Vijay C
la source
merci Vijay j'ai fait face à un problème de clic sur la vue
gonflée que
Mais cela ne détermine pas sur quel élément on clique, ce qui le rend plus ou moins inutile pour une liste? Correct?
autruche de la ferme
vous pouvez définir la balise sur convertView et vérifier la même chose dans onClick .. en utilisant la balise, l'élément sur lequel vous avez cliqué peut être identifié ...
Vijay C
J'ai trouvé une solution plus élégante qu'une balise dans votre adaptateur stocke une référence setOnClickListener et l'appelle sur la méthode onClick (View v). alors l'activité peut recevoir l'événement avec la position.
jocelyn
Votre méthode onClick est erronée. Cela devrait être onItemClick (AdapterView <?> Parent, View view, int position, long id)
IgorGanapolsky
17

Les deux réponses avant la mienne sont correctes - vous pouvez utiliser OnItemClickListener.

Il est bon de noter que la différence entre OnItemClickListeneret OnItemSelectedListener, bien que subtile, est en fait significative, car la sélection des éléments et la mise au point sont liées au mode tactile de votre AdapterView.

Par défaut, en mode tactile, il n'y a pas de sélection et de mise au point. Vous pouvez consulter ici pour plus d'informations sur le sujet.

Dimitar Dimitrov
la source
8

Cette solution est vraiment minimaliste et ne gâche pas votre code.

Dans votre list_item.xml (PAS listView!) Attribuez l'attribut android: onCliquez comme ceci:

<RelativeLayout android:onClick="onClickDoSomething">

puis dans votre activité appelez cette méthode:

public void onClickDoSomething(View view) {
   // the view is the line you have clicked on
}
Amio.io
la source
bonne solution mais, il n'y a aucun moyen d'obtenir la position de l'élément cliqué
Bilal Şimşek
@ BilalŞimşek Pendant longtemps, je n'ai plus Android, mais si le viewpeut avoir des métadonnées, cela pourrait être le moyen d'obtenir la position.
Amio.io le
6

Vous devez utiliser setOnItemClickListenerquelqu'un a dit.
Le code devrait ressembler à ceci:

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();
    }
});
Timide
la source
5

Tout d'abord, la classe doit implémenter l'écouteur de clic:

implements OnItemClickListener

Ensuite, définissez un écouteur sur ListView

yourList.setOnItemclickListener(this);

Et enfin, créez la méthode 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();
}

vous pouvez jeter un oeil et télécharger le code ici

webmaster bourax
la source
3

Utilisez l'api setOnItemClickListener () dans votre activité. Voici l'exemple.

listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){

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

});
Amey Haldankar
la source
1

Dans Kotlin, ajoutez un écouteur à votre liste Voir aussi simple que java

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

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

 }
Allen
la source