Ketika saya mengisi kembali saya ListView
, saya memanggil metode tertentu dari saya Adapter
.
Masalah :
Ketika saya menelepon updateReceiptsList
dari saya Adapter
, data di-refresh, tetapi saya ListView
tidak mencerminkan perubahan.
Pertanyaan :
Mengapa saya tidak ListView
menampilkan data baru saat saya menelepon notifyDataSetChanged
?
Adaptor :
public class ReceiptListAdapter extends BaseAdapter {
public List<Receipt> receiptlist;
private Context context;
private LayoutInflater inflater;
private DateHelpers dateH;
public ReceiptListAdapter(Activity activity, Context mcontext, List<Receipt> rl) {
context = mcontext;
receiptlist = rl;
Collections.reverse(receiptlist);
inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
dateH = new DateHelpers();
}
@Override
public int getCount() {
try {
int size = receiptlist.size();
return size;
} catch(NullPointerException ex) {
return 0;
}
}
public void updateReceiptsList(List<Receipt> newlist) {
receiptlist = newlist;
this.notifyDataSetChanged();
}
@Override
public Receipt getItem(int i) {
return receiptlist.get(i);
}
@Override
public long getItemId(int i) {
return receiptlist.get(i).getReceiptId() ;
}
private String getPuntenString(Receipt r) {
if(r.getPoints().equals("1")) {
return "1 punt";
}
return r.getPoints()+" punten";
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View vi=convertView;
final Receipt receipt = receiptlist.get(position);
ReceiptViewHolder receiptviewholder;
Typeface tf_hn = Typeface.createFromAsset(context.getAssets(), "helveticaneue.ttf");
Typeface tf_hn_bold = Typeface.createFromAsset(context.getAssets(), "helveticaneuebd.ttf");
if (vi == null) { //convertview==null
receiptviewholder = new ReceiptViewHolder();
vi = inflater.inflate(R.layout.view_listitem_receipt, null);
vi.setOnClickListener(null);
vi.setOnLongClickListener(null);
vi.setLongClickable(false);
receiptviewholder.shop = (TextView) vi.findViewById(R.id.tv_listitemreceipt_shop);
receiptviewholder.date = (TextView) vi.findViewById(R.id.tv_listitemreceipt_date);
receiptviewholder.price = (TextView) vi.findViewById(R.id.tv_listitemreceipt_price);
receiptviewholder.points = (TextView) vi.findViewById(R.id.tv_listitemreceipt_points);
receiptviewholder.shop.setTypeface(tf_hn_bold);
receiptviewholder.price.setTypeface(tf_hn_bold);
vi.setTag(receiptviewholder);
}else{//convertview is not null
receiptviewholder = (ReceiptViewHolder)vi.getTag();
}
receiptviewholder.shop.setText(receipt.getShop());
receiptviewholder.date.setText(dateH.timestampToDateString(Long.parseLong(receipt.getPurchaseDate())));
receiptviewholder.price.setText("€ "+receipt.getPrice());
receiptviewholder.points.setText(getPuntenString(receipt));
vi.setClickable(false);
return vi;
}
public static class ReceiptViewHolder {
public TextView shop;
public TextView date;
public TextView price;
public TextView points;
}
public Object getFilter() {
// XXX Auto-generated method stub
return null;
}
}
--EDIT:
menemukan Solusi
Hanya untuk memiliki beberapa kode fungsional yang saya lakukan sekarang:
listview.setAdapter( new ReceiptListAdapter(activity,mcontext, -new dataset-);
Berhasil, tapi tidak bagaimana seharusnya bekerja.
Jawaban:
Ubah metode Anda dari
Untuk
Jadi, Anda menyimpan objek yang sama dengan DataSet Anda di Adaptor.
sumber
ReceiptListObject
alih - alihList
objek, apa yang dapat Anda lakukan untuk menyelesaikan masalah ini?BaseAdapter
dan adaptor ini tidak tahu data mana yang diikat ... jadi jika saya memiliki objek khusus dan menggunakan fungsi khusus objek ini (seperticustObject.getCount()
dancustObject.getChildAt(int i)
misalnya), dan saya ingin menukar objek ini,notifyDataSetChanged
tidak berfungsi ... bagaimanapun, saya pikir masalah ini tidak pernah terjadi denganArrayAdapter
Saya memiliki masalah yang sama, dan saya menyadarinya. Saat kita membuat adaptor dan menyetelnya ke listview, listview akan mengarah ke objek di suatu tempat di memori yang dipegang adaptor, data di objek ini akan ditampilkan di listview.
jika kita membuat objek untuk adaptor dengan data lain lagi dan notifydatasetchanged ():
ini tidak akan memengaruhi data di listview karena daftar tersebut mengarah ke objek yang berbeda, objek ini tidak tahu apa-apa tentang objek baru di adaptor, dan notifyDataSetChanged () tidak memengaruhi apa pun. Jadi kita harus mengubah data dalam objek dan menghindari membuat objek baru lagi untuk adaptor
sumber
Seperti yang telah saya jelaskan alasan di balik masalah ini dan juga cara menanganinya di utas jawaban yang berbeda Di Sini . Masih saya membagikan ringkasan solusi di sini.
Salah satu alasan utama
notifyDataSetChanged()
tidak berhasil untuk Anda - adalah,Adaptor Anda kehilangan referensi ke daftar Anda .
Saat membuat dan menambahkan daftar baru ke
Adapter
. Selalu ikuti pedoman ini:arrayList
sambil mendeklarasikannya secara global.arrayList
itu akan mengurusnya, tetapi tidak pernah kehilangan referensi.adapter.clear()
danarrayList.clear()
sebelum benar-benar menambahkan data ke daftar) tetapi jangan setel adaptor, yaitu Jika data baru diisi diarrayList
than justadapter.notifyDataSetChanged()
Semoga ini membantu.
sumber
Mungkin mencoba menyegarkan ListView Anda:
receiptsListView.invalidate()
.EDIT: Pikiran lain muncul di benak saya. Sekadar catatan, coba nonaktifkan cache tampilan daftar:
sumber
Saya memiliki masalah yang sama saat menggunakan
ListAdapter
Saya membiarkan Android Studio mengimplementasikan metode untuk saya dan inilah yang saya dapatkan:
Masalahnya adalah bahwa metode ini tidak memanggil
super
implementasi sehingganotifyDataSetChange
tidak pernah dipanggil.Hapus penggantian ini secara manual atau tambahkan panggilan super dan ini akan berfungsi kembali.
sumber
Anda dapat mencoba. Ini bekerja untuk saya
sumber
Jika
adapter
diatur keAutoCompleteTextView
makanotifyDataSetChanged()
tidak berfungsi.Perlu ini untuk memperbarui adaptor:
Rujuk: http://android-er.blogspot.in/2012/10/autocompletetextview-with-dynamic.html
sumber
Jika kebetulan Anda mendarat di utas ini dan bertanya-tanya mengapa
adapter.invaidate()
atauadapter.clear()
metode tidak ada dalam kasus Anda, maka mungkin karena Anda mungkin menggunakanRecyclerView.Adapter
alih-alihBaseAdapter
yang digunakan oleh penanya pertanyaan ini. Jika menyelesaikanlist
atauarraylist
tidak menyelesaikan masalah Anda maka mungkin saja Anda membuat dua atau lebih contoh fileadapter
untuk mantan .:Aktifitas utama
dan
SomeFragment
Jika dalam kasus kedua Anda mengharapkan perubahan dalam daftar tampilan yang digelembungkan dalam tampilan pendaur ulang, maka itu tidak akan terjadi karena untuk kedua kalinya instance baru
adapter
dibuat yang tidak dilampirkan ke tampilan pendaur ulang. PengaturannotifyDataSetChanged
di adaptor kedua tidak akan mengubah konten tampilan pendaur ulang. Untuk itu buatlah contoh baru dari tampilan pendaur ulang di SomeFragment dan lampirkan ke contoh baru dari adaptor.SomeFragment
Meskipun, saya tidak menyarankan membuat beberapa contoh tampilan adaptor dan pendaur ulang yang sama.
sumber
Tambahkan kode ini
sumber
Saya memiliki masalah yang sama tetapi saya baru saja menyelesaikannya !!
Anda harus berubah menjadi
sumber
Kasus saya berbeda tetapi mungkin kasus yang sama untuk orang lain
bagi mereka yang masih tidak dapat menemukan solusi dan mencoba semua hal di atas, jika Anda menggunakan adaptor di dalam fragmen maka alasannya tidak berfungsi
fragment could be recreating so the adapter is recreating everytime the fragment recreate
Anda harus memverifikasi apakah adaptor dan daftar objek adalah null sebelum menginisialisasi
sumber