Como lidar com o ListView, clique no Android

141

Como escuto clicar em um evento em um ListView?

Isto é o que eu tenho agora

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

Quando eu faço o seguinte

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

   public void onNothingSelected(AdapterView parentView) {  

   }  
});  

Isso não parece fazer nada ao clicar.
E todos esses códigos vivem dentro de uma classe que estende Activity.

teepusink
fonte

Respostas:

182

Na exibição em lista, use setOnItemClickListener

David Hedlund
fonte
Obrigado David. Nossa, tentei setOnClickListener e setOnItemSelectedListener, mas perdi a leitura de setOnItemClickListener. Obrigado, Tee
teepusink
Eu fiz o mesmo que teepusink: D
Shereef Marzouk
Como você envia dados para essa visão detalhada? (Como o YouTube clicando através de um vídeo)
Sauron
Primeiro, a classe deve implementar o ouvinte de clique: implementa OnItemClickListener Em seguida, defina um ouvinte para o ListView yourList.setOnItemclickListener (this); E, finalmente, crie o método clic: @Override public void onItemClick (AdapterView <?> Parent, View view, int position, long id) {Toast.makeText (MainActivity.this, "Você clicou em" + países [+ posição], Toast.LENGTH_SHORT) .show (); }
bourax webmaster
88

Suponha que o objeto ListView seja lv, faça o seguinte:

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
fonte
1
lvnão é acessível por dentro onItemClick. Qual é uma boa maneira de contornar isso?
Shinjin
1
@shinjin Torne-o final. final ListView lv = (ListView) findViewById(R.id.your_list_view);
Lekensteyn
Object o = ((ListView)arg0).getItemAtPosition(position);
Maneira
Aqui está o link para a documentação: developer.android.com/reference/android/widget/...
trinity420
42

Você precisa configurar a exibição inflada como "Clicável" e "capaz de ouvir eventos de clique" no método getView () da classe do adaptador.

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

e declare o ouvinte de clique em seu ListActivity da seguinte maneira,

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

Isso é válido apenas quando você está personalizando o Adaptador estendendo o BaseAdapter.

Consulte ANDROID_SDK / samples / ApiDemos / src / com / example / android / apis / view / List14.java para obter mais detalhes

Vijay C
fonte
graças Vijay eu tenho problema clique enfrentando em vista inflar eu tenho resolver de sua resposta
dhaiwat
Mas isso não determina em qual item está sendo clicado, o que o torna mais ou menos inútil para uma lista? Corrigir?
avestruz agrícola
você pode definir tag para convertView e verificar o mesmo em onClick .. usando tag qual item é clicado pode ser identificado ...
Vijay C
Encontrei uma solução mais elegante que uma tag no seu adaptador, armazene uma referência setOnClickListener e chame-a no método onClick (View v). então a atividade pode receber o evento com a posição
precisa
Seu método onClick está errado. Deve ser onItemClick (AdapterView pai, Vista vista, posição int, long id <?>)
IgorGanapolsky
17

As duas respostas anteriores às minhas estão corretas - você pode usar OnItemClickListener.

É bom notar que a diferença entre OnItemClickListenere OnItemSelectedListener, embora pareça sutil, é de fato significativa, pois a seleção e o foco do item estão relacionados ao modo de toque do seu AdapterView.

Por padrão, no modo de toque, não há seleção e foco. Você pode dar uma olhada aqui para mais informações sobre o assunto.

Dimitar Dimitrov
fonte
8

Esta solução é realmente minimalista e não atrapalha o seu código.

Em seu list_item.xml (NÃO listView!) Atribua o atributo android: onClique assim:

<RelativeLayout android:onClick="onClickDoSomething">

e, em sua atividade, chame este método:

public void onClickDoSomething(View view) {
   // the view is the line you have clicked on
}
Amio.io
fonte
boa solução, mas não há como obter a posição do item clicado
Bilal Şimşek 16/02
@ BilalŞimşek Há muito tempo que estou fora do Android, mas se houver viewalguns metadados, pode ser a maneira de obter a posição.
Amio.io 26/02
6

Você tem que usar setOnItemClickListeneralguém disse.
O código deve ser assim:

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
fonte
5

Primeiro, a classe deve implementar o ouvinte de clique:

implements OnItemClickListener

Em seguida, defina um ouvinte para o ListView

yourList.setOnItemclickListener(this);

E, finalmente, crie o método 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();
}

você pode dar uma olhada e baixar o código aqui

webmaster bourax
fonte
3

Use a API setOnItemClickListener () em sua atividade. A seguir está a amostra.

listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){

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

});
Amey Haldankar
fonte
1

No Kotlin, adicione um ouvinte ao seu listView tão simples quanto java

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

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

 }
Allen
fonte