Saya memiliki tempat di ListView
mana setiap elemen dalam daftar berisi TextView dan dua Tombol berbeda. Sesuatu seperti ini:
ListView
--------------------
[Text]
[Button 1][Button 2]
--------------------
[Text]
[Button 1][Button 2]
--------------------
... (and so on) ...
Dengan kode ini saya dapat membuat OnItemClickListener
untuk seluruh item:
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> list, View view, int position, long id) {
Log.i(TAG, "onListItemClick: " + position);
}
}
});
Namun, saya tidak ingin seluruh item dapat diklik, tetapi hanya dua tombol dari setiap elemen daftar.
Jadi pertanyaan saya adalah, bagaimana cara menerapkan onClickListener untuk dua tombol ini dengan parameter berikut:
int button
(tombol elemen mana yang telah diklik)int position
(yang merupakan elemen dalam daftar di mana klik tombol terjadi)
Pembaruan: Saya menemukan solusi seperti yang dijelaskan dalam jawaban saya di bawah ini. Sekarang saya dapat mengklik / mengetuk tombol melalui layar sentuh. Namun, saya tidak dapat secara manual memilihnya dengan trackball. Selalu memilih seluruh item daftar dan dari sana langsung menuju ke item daftar berikutnya mengabaikan tombol, meskipun saya mengatur .setFocusable(true)
dan setClickable(true)
untuk tombol di getView()
.
Saya juga menambahkan kode ini ke adaptor daftar kustom saya:
@Override
public boolean areAllItemsEnabled() {
return false;
}
@Override
public boolean isEnabled(int position) {
return false;
}
Hal ini menyebabkan tidak ada item daftar yang dapat dipilih sama sekali. Tapi itu tidak membantu membuat tombol bersarang bisa dipilih.
Adakah yang punya ide?
Jawaban:
Solusi untuk ini sebenarnya lebih mudah dari yang saya kira. Anda bisa menambahkan
getView()
setOnClickListener () pada metode adaptor kustom Anda untuk tombol yang Anda gunakan.Setiap data yang terkait dengan tombol harus ditambahkan dengan
myButton.setTag()
dalamgetView()
dan dapat diakses di onClickListener melaluiview.getTag()
Saya memposting solusi terperinci di blog saya sebagai tutorial.
sumber
Ini semacam tambahan @ znq's jawaban ...
Ada banyak kasus di mana Anda ingin mengetahui posisi baris untuk item yang diklik DAN Anda ingin tahu tampilan mana di baris yang diketuk. Ini akan menjadi jauh lebih penting dalam UI tablet.
Anda dapat melakukan ini dengan adaptor khusus berikut:
sumber
Untuk pembaca masa depan:
Untuk memilih tombol secara manual dengan menggunakan trackball:
Dan untuk menonaktifkan fokus pada seluruh daftar item:
Ini berfungsi dengan baik untuk saya, saya bisa mengklik tombol dengan layar sentuh dan juga mengubah fokus klik menggunakan tombol
sumber
Saya tidak memiliki banyak pengalaman daripada pengguna di atas tetapi saya menghadapi masalah yang sama dan saya Memecahkan ini dengan Solusi di bawah ini
btnRemoveClick Klik acara
sumber
Mungkin Anda telah menemukan cara melakukannya, tetapi Anda dapat menelepon
dan sekarang tombol Anda akan menangkap fokus
sumber
Saya tidak yakin tentang menjadi cara terbaik, tetapi berfungsi dengan baik dan semua kode tetap ada di ArrayAdapter Anda.
sumber
Saya Tahu sudah terlambat tetapi ini mungkin membantu, ini adalah contoh bagaimana saya menulis kelas adaptor khusus untuk berbagai tindakan klik
sumber
Bukankah solusi platform untuk implementasi ini menggunakan menu konteks yang ditampilkan di media lama?
Apakah penulis pertanyaan mengetahui menu konteks? Menumpuk tombol dalam tampilan daftar memiliki implikasi kinerja, akan mengacaukan UI Anda dan melanggar desain UI yang disarankan untuk platform.
Di flipside; menu konteks - pada dasarnya tidak memiliki representasi pasif - tidak jelas bagi pengguna akhir. Pertimbangkan mendokumentasikan perilaku itu?
Panduan ini akan memberi Anda awal yang baik.
http://www.mikeplate.com/2010/01/21/show-a-context-menu-for-long-clicks-in-an-android-listview/
sumber