Di bawah ini adalah potongan kode dengan ListView. Saya menambahkan emptyView dan headerView. Menambahkan headerView menyebabkan posisi di onItemClick bertambah satu.
Jadi tanpa headerView, elemen list pertama akan memiliki posisi 0, dengan headerView, posisi elemen daftar pertama adalah 1!
Ini menyebabkan kesalahan pada adaptor saya, misalnya saat memanggil getItem () dan menggunakan beberapa metode lain, lihat di bawah. Hal yang aneh: Dalam metode getView () dari adaptor, elemen daftar pertama diminta dengan posisi 0 bahkan jika headerView ditambahkan !!
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
ListView list = (ListView) viewSwitcher.findViewById(R.id.list);
View emptyView = viewSwitcher.findViewById(R.id.empty);
list.setEmptyView(emptyView);
View sectionHeading = inflater.inflate(R.layout.heading, list, false);
TextView sectionHeadingTextView = (TextView) sectionHeading.findViewById(R.id.headingText);
sectionHeadingTextView.setText(headerText);
list.addHeaderView(sectionHeading);
list.setAdapter(listAdapter);
list.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
listAdapter.getItem(position);
//Do something with it
}
});
}
Beberapa metode adaptor:
@Override
public int getViewTypeCount() {
return TYPE_COUNT;
}
@Override
public int getItemViewType(int position) {
return (position < items.size()) ? ITEM_NORMAL : ITEM_ADVANCED;
}
@Override
public Product getItem(int position) {
return items.get(position);
}
@Override
public boolean areAllItemsEnabled() {
return false;
}
@Override
public boolean isEnabled(int position) {
return (position < items.size());
}
Apakah ini perilaku normal saat menambahkan headerView ?? Dan bagaimana cara mengatasi masalah pada adaptor saya?
android
listview
listadapter
d1rk
sumber
sumber
Jawaban:
Saya baru saja menemukan masalah ini dan cara terbaik tampaknya menggunakan
ListView.getItemAtPosition(position)
alih - alihListAdapter.getItem(position)
sebagaiListView
akun versi untuk header, yaitu: -Lakukan ini sebagai gantinya:
sumber
onItemClick
memberi Andaparent
alasan. Anda dapat menggunakanparent.getItemAtPosition(position)
AdapterView
juga hanya meneruskan ke listAdapter yang ditambahkan.return (adapter == null || position < 0) ? null : adapter.getItem(position);
Jika Anda tidak peduli tentang klik ke header, kurangi jumlah tampilan header dari posisi untuk mendapatkan posisi adaptor Anda:
sumber
Jika Anda menambahkan header ke
ListView
item itu menjadi item pertama dalam daftar. Anda dapat mengimbanginya dengan menimpagetCount()
untuk mengembalikan satu item lebih sedikit, tetapi pastikan Anda menanganigetItem()
,getItemId()
dan seterusnya karena tajuk akan menjadi item di posisi 0.sumber
ListView.getHeaderViewsCount()
Saat menerapkan,
AdapterView.OnItemClickListener
kami hanya mengurangi header dari posisi.sumber
Tidak perlu mengubah kode apa pun. Cukup gunakan kode di bawah ini.
sumber
Jangan gunakan adaptor Anda, gunakan adaptor 'dihiasi' dari getAdapter.
sumber
Salah satu solusi untuk ini adalah memetakan id ke indeks. Pada dasarnya membuat id mengembalikan indeks dalam daftar dan pendengar klik akan melakukan:
sumber
Hai, kami dapat menyelesaikan ini dengan cara ini terlebih dahulu Anda membuat tampilan header, setelah memasukkan dalam daftar Anda dan langkah terakhir tidak dapat mengatur setOnClickListener. itu berhasil untuk saya. setiap umpan balik diterima
sumber
Bukan untuk menambahkan banyak hal baru yang tidak ditambahkan @Ramesh tetapi beberapa konteks tambahan:
sumber
Use getSelectedItemPosition () Mengembalikan posisi item yang saat ini dipilih dalam kumpulan data adaptor. Cara ini tidak perlu mengkhawatirkan ukuran header atau footer.
sumber
Ini dapat membantu seseorang, memperbaiki jawaban Farid_z dan Philipp, kita dapat dengan benar menerapkan setItemChecked dan setTitle dengan sesuatu seperti ini
sumber