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.

Respostas:


182

Na exibição em lista, use setOnItemClickListener


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
    */  
  }
});

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


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.


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
}

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

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


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.
}

});

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()

 }
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.