Saya memiliki ListView
dengan adaptor khusus yang memperluas BaseAdapter
dan memiliki 2 tipe tampilan. Saat saya menjalankan metode adapter.removeRow(position)
saya, data untuk adaptor diperbarui dengan benar, dan daftarnya mencerminkan hal ini, tetapi tipe tampilan tidak diperbarui dengan benar. Adaptor didukung oleh
ArrayList<Map<String, String>> rows = new ArrayList<Map<String, String>>();
dan saya memiliki subset
List<Integer> flashSet = new ArrayList<Integer>();
yang merupakan daftar semua posisi ViewType 1 (sebagai lawan dari tipe tampilan standar 0).
Ini adalah metode adaptor removeRow(position)
saya:
public void removeRow(int position) {
if (getItemViewType(position) == TYPE_FLASH) {
flashSet.remove(position);
}
for (int flashPosition:flashSet) {
System.out.println(tag+"is "+flashPosition+" going to be moved?");
if (flashPosition > position) {
flashPosition -= 1;
System.out.println(tag+"Yes! It's been moved to "+flashPosition);
}
}
rows.remove(position);
notifyDataSetChanged();
}
Inilah metode getView
saya:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
FlashHolder flashHolder;
ClipHolder clipHolder;
int type = getItemViewType(position);
if (convertView == null) {
if (type == TYPE_CLIP) {
convertView = rowInflater.inflate(R.layout.clip_note_row_layout, null);
clipHolder = new ClipHolder();
flashHolder = null;
clipHolder.textView = (TextView)(convertView.findViewById(R.id.clip_text));
convertView.setTag(clipHolder);
} else {
convertView = rowInflater.inflate(R.layout.flash_row_layout, null);
clipHolder = null;
flashHolder = new FlashHolder();
flashHolder.front = (TextView)(convertView.findViewById(R.id.flash_text));
flashHolder.back = (TextView)(convertView.findViewById(R.id.clip_text));
convertView.setTag(flashHolder);
}
} else {
if (type == TYPE_CLIP) {
clipHolder = (ClipHolder)convertView.getTag();
flashHolder = null;
} else {
clipHolder = null;
flashHolder = (FlashHolder)convertView.getTag();
}
}
if (type == TYPE_CLIP) {
clipHolder.textView.setText(rows.get(position).get("clip"));
} else {
flashHolder.front.setText(rows.get(position).get("flash_text"));
flashHolder.back.setText(rows.get(position).get("clip"));
}
return convertView;
}
Saya tahu bahwa saya dapat membuat adapter
baru, memberinya ArrayList
yang diperbarui dan memanggil listView.setAdapter(adapter)
tetapi ini tampaknya berlebihan ketika saya hanya mencoba menghapus satu item dari daftar yang mungkin panjang. Lihat foto sebelum dan sesudah dihapus:
Lalu saya menghapus item pertama. Kata "yang" tersembunyi di balik item "Ayo kita tonton" dan sekarang item "terinspirasi oleh..." tersembunyi di balik item kosong 3.
Jadi, data sedang diperbarui, tipe tampilan tidak. Terima kasih untuk bantuannya!
getViewTypeCount()
dangetItemViewType()
di adaptor Anda? - person M-WaJeEh   schedule 13.03.2013{
dan}
dalamgetView()
Anda. Harap perbarui pertanyaan Anda jika itu bukan kesalahan pengkodean. - person M-WaJeEh   schedule 13.03.2013