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.