2010-03-18 7 views
130

Comment écouter l'événement click sur un ListView?Comment gérer le clic ListView dans Android

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 pas faire quoi que ce soit en cliquant dessus.
Et tous ces codes vivent dans une classe qui prolonge l'activité.

Répondre

173

votre point de vue de la liste, utilisez setOnItemClickListener

+0

Merci David. Geezzz, j'ai essayé setOnClickListener et setOnItemSelectedListener mais j'ai manqué de lire setOnItemClickListener. Merci, Tee – teepusink

+0

J'ai fait la même chose que teepusink: D –

+0

Comment envoyez-vous alors des données à cette vue détaillée? (Comme youtube naviguant sur une vidéo) – Sauron

41

Vous devez définir l'affichage gonflé méthode « cliquable » et « pouvoir écouter de cliquer sur » les événements dans votre getView de classe d'adaptateur().

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

et déclarer l'auditeur 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 est vrai que lorsque vous personnalisez l'adaptateur par l'extension BaseAdapter.

Consulte la ANDROID_SDK/samples/ApiDemos/src/com/example/android/apis/view/List14.java pour plus de détails

+0

merci Vijay j'ai fais face à un problème de clic sur la vue de gonflement j'ai résoudre de votre réponse – dhaiwat

+0

Mais cela ne détermine pas quel élément est cliqué, ce qui le rend plus ou moins inutile pour une liste? Correct? –

+0

vous pouvez définir tag pour convertirView et vérifier la même chose dans onClick .. en utilisant la balise sur laquelle l'élément est cliqué peut être identifié ... –

17

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

Il est bon de noter que la différence entre OnItemClickListener et OnItemSelectedListener, tout en sonnant subtile, est en fait significatif, comme élément de sélection et de mise au point sont en relation avec le 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 jeter un oeil here pour plus d'informations sur le sujet.

+2

bah android madness – max4ever

84

objet ListView Supposer lv, faire le suivantes-

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

'lv' n'est pas accessible dans' onItemClick'. Quelle est une bonne façon de contourner cela? – shinjin

+1

@shinjin Rendez-le final. 'final ListView lv = (ListView) findViewById (R.id.your_list_view);' – Lekensteyn

+0

Propre façon: 'Objet o = ((ListView) arg0) .getItemAtPosition (position);' – JimmyB

5

Vous devez utiliser setOnItemClickListener quelqu'un 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(); 
    } 
}); 
5

D'abord, la classe doit implémente le clic listenener:

implements OnItemClickListener 

Définissez ensuite un écouteur au ListView

yourList.setOnItemclickListener(this); 

Et enfin, créer la méthode de 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 regarder et télécharger le code here

6

Cette solution est vraiment minimalistes et ne pas gâcher votre code.

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

<RelativeLayout android:onClick="onClickDoSomething"> 

puis dans votre appel d'activité cette méthode:

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

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

listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){ 

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

});