Cara menangani klik ListView di Android


141

Bagaimana cara mendengarkan acara klik pada ListView?

Inilah yang saya miliki sekarang

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

Ketika saya melakukan hal berikut

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

   public void onNothingSelected(AdapterView parentView) {  

   }  
});  

Tampaknya tidak melakukan apa-apa saat klik.
Dan semua kode itu hidup dalam kelas yang memperluas Activity.

Jawaban:


182

Pada tampilan daftar Anda, gunakan setOnItemClickListener


Terima kasih David. Ya ampun, saya mencoba setOnClickListener dan setOnItemSelectedListener tetapi tidak membaca setOnItemClickListener. Terima kasih, Tee
teepusink

saya melakukan hal yang sama seperti teepusink: D
Shereef Marzouk

Bagaimana cara Anda mengirim data ke tampilan terperinci itu? (Seperti youtube mengklik melalui video)
Sauron

Pertama, kelas harus mengimplementasikan pendengar klik: mengimplementasikan OnItemClickListener Kemudian atur pendengar ke ListView yourList.setOnItemclickListener (ini); Dan akhirnya, buat metode klik: @Override public void onItemClick (orangtua AdaptorViewView? Toast.LENGTH_SHORT) .show (); }
bourax webmaster

88

Misalkan objek ListView adalah lv, lakukan hal berikut-

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
lvtidak dapat diakses di dalam onItemClick. Apa cara yang bagus untuk menyiasatinya?
shinjin

1
@shinjin Jadikan final. final ListView lv = (ListView) findViewById(R.id.your_list_view);
Lekensteyn

Cara bersih:Object o = ((ListView)arg0).getItemAtPosition(position);
JimmyB


42

Anda perlu mengatur tampilan yang meningkat "Dapat Diklik" dan "dapat mendengarkan acara klik" dalam metode getView () kelas adaptor Anda.

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

dan nyatakan pendengar klik di ListActivity Anda sebagai berikut,

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

Ini berlaku hanya ketika Anda mengkustomisasi Adaptor dengan memperluas BaseAdapter.

Rujuk ANDROID_SDK / samples / ApiDemos / src / com / example / android / apis / view / List14.java untuk detail lebih lanjut


terima kasih Vijay saya telah menghadapi masalah klik pada tampilan mengembang saya telah memecahkan dari jawaban Anda
dhaiwat

Tetapi ini tidak menentukan item apa yang diklik, yang membuatnya lebih atau kurang berguna untuk daftar? Benar?
Burung unta pertanian

Anda dapat mengatur tag untuk convertView dan memeriksa yang sama di onClick .. menggunakan tag item mana yang diklik dapat diidentifikasi ...
Vijay C

Saya telah menemukan solusi yang lebih elegan daripada sebuah tag di adaptor Anda menyimpan referensi setOnClickListener dan menyebutnya pada metode onClick (View v). maka aktivitas dapat menerima acara dengan posisi.
jocelyn

Metode onClick Anda salah. Seharusnya onItemClick (induk AdapterView <?>, Tampilan tampilan, posisi int, id panjang)
IgorGanapolsky

17

Dua jawaban sebelum saya benar - Anda dapat menggunakan OnItemClickListener.

Baik untuk dicatat bahwa perbedaan antara OnItemClickListenerdan OnItemSelectedListener, meskipun terdengar halus, sebenarnya penting, karena pemilihan dan fokus item terkait dengan mode sentuh Anda AdapterView.

Secara default, dalam mode sentuh, tidak ada pilihan dan fokus. Anda dapat melihat di sini untuk info lebih lanjut tentang masalah ini.


8

Solusi ini sangat minimalis dan tidak mengacaukan kode Anda.

Di list_item.xml Anda (BUKAN listView!) Tentukan atribut android: onClick seperti ini:

<RelativeLayout android:onClick="onClickDoSomething">

dan kemudian dalam aktivitas Anda panggil metode ini:

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

solusi bagus tetapi, tidak ada cara untuk mendapatkan posisi item diklik
Bilal Şimşek

@ BilalŞimşek Untuk waktu yang lama saya sudah keluar dari Android tetapi jika viewdapat memiliki beberapa metadata, itu bisa menjadi cara bagaimana mendapatkan posisi.
Amio.io

6

Anda harus menggunakan setOnItemClickListenerseseorang berkata.
Kode harus seperti ini:

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

Pertama, kelas harus mengimplementasikan pendengar klik:

implements OnItemClickListener

Kemudian atur pendengar ke ListView

yourList.setOnItemclickListener(this);

Dan akhirnya, buat metode 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();
}

Anda dapat melihatnya dan mengunduh kode di sini


3

Gunakan api setOnItemClickListener () di aktivitas Anda. Berikut ini adalah sampelnya.

listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){

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

});

1

Di Kotlin, tambahkan pendengar ke listView Anda sesederhana java

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

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

 }
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.