Anda harus menjalankannya di utas UI. Buat penangan dalam utas UI dan kemudian poskan Runable to it
Kirill Kulakov
11
Sekali lagi: notifyDataSetChanged () tidak berfungsi setidaknya tidak untuk praktik penggunaan yang direkomendasikan (baca tidak usang). Jika menggunakan listview, adaptor kursor, dan penyedia konten, Anda dapat mencoba sesuatu seperti: gettLoaderManager (). RestartLoader (). Lihat: stackoverflow.com/a/19657500/1087411 Saya ingin melihat setidaknya beberapa dokumentasi di notifyDataSetChanged (). Untuk banyak di android diserahkan kepada pengujian kotak hitam.
Anderson
Jika notifyDataSetChanged tidak berfungsi, Anda adalah orang yang melakukan kesalahan
zdarsky.peter
4
notifyDataSetChanged tidak selalu berfungsi. Saya tidak yakin mengapa ini bertentangan. Terkadang Anda harus memanggil listView.setAdapter (adaptor) untuk menghapus tampilan lama. Lihat juga: stackoverflow.com/a/16261588/153275
1
Saya tidak pernah bisa mendapatkan notifyDataSetChanged berfungsi. Saya dapat dengan jelas melihat bahwa koleksi yang saya makan ke adaptor telah berubah (elemen dihapus) tetapi notifyDataSetChanged tidak pernah melakukan apa pun. Tidak yakin apakah metode ini rusak?
Ini adalah jawaban yang benar jika seseorang hanya perlu MENGURANGI tampilan. Misalnya, setelah login pengguna terjadi yang perlu memaparkan lebih banyak informasi atau opsi dalam setiap tampilan dari listView. Itulah yang perlu saya lakukan, jadi berikan suara. Jika data yang mendasarinya berubah, mungkin ide yang lebih baik untuk menggunakan notifyDataSetChanged ().
SBerg413
Sebenarnya invalidateViews()dalam set kode sumber mDataChanged = true;jadi saya tidak yakin apakah ini menghasilkan kinerja yang lebih baik dibandingkan dengannotifyDataSetChanged()
vovahost
Anda menyelamatkan hari saya, Bung!
oskarko
Anda dapat mengambil jenis daftar yang merupakan "daftar yang dapat diobservasi", tidak perlu notifydataset diubah
Priya
153
Harap mengabaikan semua invalidate(), invalidateViews(), requestLayout(), ... jawaban untuk pertanyaan ini.
Jika panggilan notifyDataSetChanged()tidak berfungsi, semua metode tata letak tidak akan membantu. Percayalah ListViewitu telah diperbarui dengan benar. Jika Anda gagal menemukan perbedaannya, Anda perlu memeriksa dari mana data di adaptor Anda berasal.
Jika ini hanya koleksi yang Anda simpan di memori, periksa apakah Anda benar-benar menghapus atau menambahkan item ke koleksi sebelum memanggil notifyDataSetChanged().
Jika Anda bekerja dengan database atau layanan backend Anda harus memanggil metode untuk mengambil kembali informasi (atau memanipulasi data dalam memori) sebelum memanggil notifyDataSetChanged().
Masalahnya adalah ini notifyDataSetChangedhanya berfungsi jika dataset telah berubah. Jadi itulah tempat untuk mencari jika Anda tidak menemukan perubahan yang terjadi. Debug jika dibutuhkan.
ArrayAdapter vs BaseAdapter
Saya menemukan bahwa bekerja dengan adaptor yang memungkinkan Anda mengelola koleksi, seperti BaseAdapter berfungsi lebih baik. Beberapa adaptor seperti ArrayAdapter sudah mengelola koleksi mereka sendiri sehingga menyulitkan untuk mendapatkan koleksi yang tepat untuk pembaruan. Ini sebenarnya hanya lapisan kesulitan tambahan yang tidak perlu dalam kebanyakan kasus.
Utas UI
Benar bahwa ini harus dipanggil dari utas UI. Jawaban lain memiliki contoh tentang cara mencapai ini. Namun ini hanya diperlukan jika Anda mengerjakan informasi ini dari luar utas UI. Itu dari layanan atau utas non UI. Dalam kasus sederhana, Anda akan memperbarui data dari klik tombol atau aktivitas / fragmen lain. Jadi masih dalam utas UI. Tidak perlu selalu memunculkan runOnUiTrhead itu.
Proyek Contoh Cepat
Dapat ditemukan di https://github.com/hanscappelle/so-2250770.git . Cukup klon dan buka proyek di Android Studio (gradle). Proyek ini memiliki MainAcitivity yang membangun ListViewdengan semua data acak. Daftar ini dapat di-refresh menggunakan menu aksi.
Implementasi adaptor yang saya buat untuk contoh ini ModelObject memperlihatkan pengumpulan data
publicclassMyListAdapterextendsBaseAdapter{/**
* this is our own collection of data, can be anything we
* want it to be as long as we get the abstract methods
* implemented using this data and work on this data
* (see getter) you should be fine
*/privateList<ModelObject> mData;/**
* our ctor for this adapter, we'll accept all the things
* we need here
*
* @param mData
*/publicMyListAdapter(finalContext context,finalList<ModelObject> mData){this.mData = mData;this.mContext = context;}publicList<ModelObject> getData(){return mData;}// implement all abstract methods here}
Kode dari MainActivity
publicclassMainActivityextendsActivity{privateMyListAdapter mAdapter;@Overrideprotectedvoid onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);ListView list =(ListView) findViewById(R.id.list);// create some dummy data hereList<ModelObject> objects = getRandomData();// and put it into an adapter for the list
mAdapter =newMyListAdapter(this, objects);
list.setAdapter(mAdapter);// mAdapter is available in the helper methods below and the // data will be updated based on action menu interactions// you could also keep the reference to the android ListView // object instead and use the {@link ListView#getAdapter()} // method instead. However you would have to cast that adapter // to your own instance every time}/**
* helper to show what happens when all data is new
*/privatevoid reloadAllData(){// get new modified random dataList<ModelObject> objects = getRandomData();// update data in our adapter
mAdapter.getData().clear();
mAdapter.getData().addAll(objects);// fire the event
mAdapter.notifyDataSetChanged();}/**
* helper to show how only changing properties of data
* elements also works
*/privatevoid scrambleChecked(){Random random =newRandom();// update data in our adapter, iterate all objects and // resetting the checked optionfor(ModelObject mo : mAdapter.getData()){
mo.setChecked(random.nextBoolean());}// fire the event
mAdapter.notifyDataSetChanged();}}
Anda salah. notifyDataSetChanged () tidak berfungsi untuk saya, tetapi invalidateViews () melakukannya dengan benar.
babay
6
Saya memiliki masalah di mana elemen aktual dalam daftar tidak berubah, misalnya jumlah elemen yang sama. Tetapi masalahnya adalah bahwa cara mereka disajikan perlu berubah. Itu berarti kode adaptor saya untuk membangun UI harus dijalankan lagi dan kemudian menyembunyikan beberapa elemen dalam baris daftar dengan benar. notifyDataSetChanged () tidak berfungsi ...
Sven Haiges
9
Jawaban ini sangat membantu saya. Saya menyimpan array dalam memori untuk alasan fitur tertentu. Untuk memperbaikinya saya sekarang menelepon adapter.clear(), dan adapter.addAll(Array<T>)sebelum meneleponnotifyDataSetChanged()
Michael DePhillips
2
@ hcpl, bagaimana saya harus memanggil notifyDataSetChanged jika saya di OnClickListener adaptor untuk kotak centang? invalidateViews sedang menyelesaikan pekerjaan sekarang. Mengapa invalidateViews metode yang salah untuk menelepon?
derek
1
Saya tidak pernah bisa mendapatkan notifyDataSetChanged berfungsi. Saya dapat dengan jelas melihat bahwa koleksi yang saya makan ke adaptor telah berubah (elemen dihapus) tetapi notifyDataSetChanged tidak pernah melakukan apa pun. Tidak yakin apakah metode ini rusak?
Byemute
42
Panggil runnable kapan pun Anda mau:
runOnUiThread(run);
OnCreate(), Anda menetapkan utas runnable Anda:
run =newRunnable(){publicvoid run(){//reload content
arraylist.clear();
arraylist.addAll(db.readAll());
adapter.notifyDataSetChanged();
listview.invalidateViews();
listview.refreshDrawableState();}};
Bekerja juga dalam kasus saya, di mana saya perlu memperbarui tampilan daftar berdasarkan data yang berasal dari koneksi TCP (dari utas "nonUI"). Satu-satunya cara agar daftar tersebut digambar ulang adalah dengan menghapus dan menambahkan kembali semua elemen ArrayList. Lagi pula, jika Anda sudah berada di utas UI Anda tidak perlu memanggil kode melalui runOnUiThread()fungsi.
Andre
Terima kasih! Ini bekerja untuk saya. Untuk semua orang yang ingin menjalankan ini dari sebuah fragmen, Anda harus menggunakan getActivity (). RunOnUiThread (Runnable baru ... untuk memastikan kode dijalankan pada utas UI
codingpuss
Saya tidak melihat tujuan run = new Runnable()dan hanya memberi saya fungsi public void refreshUIThread()metode yang memodelkan run()metode Anda (yang berfungsi juga).
T.Woody
11
saya mendapat beberapa masalah dengan penyegaran dinamis dari tampilan daftar saya.
Panggil notifyDataSetChanged () pada Adaptor Anda.
Beberapa spesifik tambahan tentang bagaimana / kapan menelepon notifyDataSetChanged () dapat dilihat di video Google I / O ini.
notifyDataSetChanged () tidak berfungsi dengan baik dalam kasus saya [saya memanggil notifyDataSetChanged dari kelas lain]. Hanya dalam kasus saya mengedit ListView di Activity (Thread) yang sedang berjalan. Video itu berkat Christopher memberi petunjuk terakhir.
Di kelas kedua saya digunakan
Runnable run =newRunnable(){publicvoid run(){
contactsActivity.update();}};
contactsActivity.runOnUiThread(run);
untuk mengakses pembaruan () dari Aktivitas saya. Pembaruan ini termasuk
myAdapter.notifyDataSetChanged();
untuk memberitahu Adaptor untuk menyegarkan tampilan. Bekerja dengan baik sejauh yang bisa saya katakan.
jika Anda masih tidak puas dengan Refreshment ListView, Anda dapat melihat potongan ini, ini untuk memuat listView dari DB, Sebenarnya yang harus Anda lakukan hanyalah memuat ulang ListView, setelah Anda melakukan Operasi CRUD. Ini bukan cara terbaik untuk kode, tetapi akan menyegarkan ListView seperti yang Anda inginkan ..
Ini bekerja untuk Saya .... jika Anda menemukan solusi yang lebih baik, silakan Bagikan ...
.......
......
lakukan Operasi CRUD Anda ..
......
.....
DBAdapter.open ();
DBAdapter.insert_into_SingleList ();
// Bawa DB_result itu dan tambahkan ke daftar sebagai isinya ....
ls2.setAdapter (ArrayAdapter baru (DynTABSample.this,
android.R.layout.simple_list_item_1, DBAdapter.DB_ListView));
DBAdapter.close ();
Solusi yang diajukan oleh orang-orang di pos ini berfungsi atau tidak terutama tergantung pada versi Android perangkat Anda. Sebagai Contoh untuk menggunakan metode AddAll Anda harus meletakkan android: minSdkVersion = "10" di perangkat android Anda.
Untuk mengatasi pertanyaan ini untuk semua perangkat yang saya buat metode saya sendiri di adaptor saya dan gunakan di dalam metode add and remove yang diwarisi dari ArrayAdapter yang memperbarui data Anda tanpa masalah.
Kode Saya: Menggunakan kelas data saya sendiri RaceResult, Anda menggunakan model data Anda sendiri.
ResultGpRowAdapter.java
publicclassResultGpRowAdapterextendsArrayAdapter<RaceResult>{Context context;int resource;List<RaceResult> data=null;publicResultGpRowAdapter(Context context,int resource,List<RaceResult> objects){super(context, resource, objects);this.context = context;this.resource = resource;this.data = objects;}@OverridepublicView getView(int position,View convertView,ViewGroup parent){........}//my own method to populate data publicvoid myAddAll(List<RaceResult> items){for(RaceResult item:items){super.add(item);}}
ResultsGp.java
publicclassResultsGpextendsActivity{@Overrideprotectedvoid onCreate(Bundle savedInstanceState){......................ListView list =(ListView)findViewById(R.id.resultsGpList);ResultGpRowAdapter adapter =newResultGpRowAdapter(this, R.layout.activity_result_gp_row,newArrayList<RaceResult>());//Empty data
list.setAdapter(adapter);............//LOAD a ArrayList<RaceResult> with dataArrayList<RaceResult> data =newArrayList<RaceResult>();
data.add(newRaceResult(....));
data.add(newRaceResult(....));.......
adapter.myAddAll(data);//Your list will be udpdated!!!
Anda perlu menggunakan satu objek dari daftar itu yang mengumpulkan data yang Anda kembangkan ListView. Jika referensi berubah maka tidak notifyDataSetChanged()berfungsi. Kapan pun Anda menghapus elemen dari tampilan daftar, hapus juga dari daftar yang Anda gunakan apakah itu ArrayList <> atau Sesuatu yang lain maka Panggil
notifyDataSetChanged() objek kelas adaptor Anda.
Jadi di sini lihat bagaimana saya mengaturnya di adaptor saya lihat di bawah
Saya tidak bisa mendapatkan notifyDataSetChanged () untuk bekerja memperbarui SimpleAdapter saya, jadi alih-alih saya mencoba menghapus semua tampilan yang dilampirkan ke tata letak induk menggunakan removeAllViews (), kemudian menambahkan ListView, dan yang berfungsi, memungkinkan saya untuk memperbarui UI:
Bagi saya setelah mengubah informasi dalam basis data sql tidak ada yang bisa menyegarkan tampilan daftar (menjadi tampilan daftar yang dapat diperluas) jadi jika notifyDataSetChanged () tidak membantu, Anda dapat mencoba untuk menghapus daftar Anda terlebih dahulu dan menambahkannya lagi setelah panggilan notifyDataSetChanged (). Sebagai contoh
Saya sama ketika, dalam sebuah fragmen, saya ingin mengisi ListView (dalam satu TextView) dengan alamat mac perangkat BLE yang dipindai selama beberapa waktu.
Saya pikir itu tergantung pada apa yang Anda maksud dengan penyegaran. Maksud Anda tampilan GUI harus di-refresh, atau apakah maksud Anda bahwa tampilan anak-anak harus di-refresh sedemikian rupa sehingga Anda dapat memanggil getChildAt (int) secara terprogram dan mendapatkan tampilan yang sesuai dengan apa yang ada di Adaptor.
Jika Anda ingin tampilan GUI di-refresh, maka panggil notifyDataSetChanged () pada adaptor. GUI akan disegarkan saat selanjutnya digambar ulang.
Jika Anda ingin dapat memanggil getChildAt (int) dan mendapatkan tampilan yang mencerminkan apa yang ada di adaptor, maka panggil ke layoutChildren (). Ini akan menyebabkan tampilan anak direkonstruksi dari data adaptor.
Saya memiliki ArrayList yang ingin saya tampilkan di listview. ArrayList mengandung elemen dari mysql. Saya mengganti metode onRefresh dan dalam metode itu saya menggunakan tablelayout.removeAllViews (); dan kemudian mengulangi proses untuk mendapatkan data lagi dari database. Tapi sebelum itu pastikan untuk menghapus ArrayList Anda atau apa pun struktur data atau data baru akan ditambahkan ke yang lama ..
Jika Anda menggunakan garis panduan Android dan Anda menggunakan ContentProvidersuntuk mendapatkan data dari Databasedan Anda menampilkannya dalam ListViewmenggunakan CursorLoaderdanCursorAdapters , maka Anda semua perubahan pada data terkait akan secara otomatis tercermin dalam ListView.
Anda getContext().getContentResolver().notifyChange(uri, null);di kursor di jendelaContentProvider akan cukup untuk mencerminkan perubahan. Tidak perlu untuk bekerja ekstra.
Tetapi ketika Anda tidak menggunakan ini semua maka Anda harus memberi tahu adaptor ketika dataset berubah. Anda juga perlu mengisi ulang / memuat ulang dataset Anda (katakanlah daftar) dan kemudian Anda perlu meneleponnotifyDataSetChanged() adaptor.
notifyDataSetChanged()tidak akan berfungsi jika tidak ada perubahan pada datset. Berikut adalah komentar di atas metode dalam dokumen-
/**
* Notifies the attached observers that the underlying data has been changed
* and any View reflecting the data set should refresh itself.
*/
Saya hanya bisa mendapatkan notifyDataSetChanged hanya dengan mendapatkan data adaptor baru, kemudian mengatur ulang adaptor untuk tampilan daftar, lalu membuat panggilan seperti:
Jika saya berbicara tentang skenario saya di sini, jawaban di atas tidak akan berfungsi karena saya memiliki aktivitas yang menampilkan daftar nilai db bersama dengan tombol hapus dan ketika tombol hapus ditekan, saya ingin menghapus item itu dari daftar.
Yang keren adalah, saya tidak menggunakan tampilan pendaur ulang tetapi tampilan daftar sederhana dan tampilan daftar yang diinisialisasi di kelas adaptor. Jadi, memanggil notifyDataSetChanged()tidak akan melakukan apa pun di dalam kelas adaptor dan bahkan di kelas aktivitas di mana objek adaptor diinisialisasi karena metode hapus berada di kelas adaptor.
Jadi, solusinya adalah menghapus objek dari adaptor dalam getViewmetode kelas adaptor (untuk hanya menghapus objek tertentu tetapi jika Anda ingin menghapus semua, panggilclear() ).
Bagi Anda untuk mendapatkan ide, seperti apa kode saya,
publicclassWordAdapterextendsArrayAdapter<Word>{Context context;publicWordAdapter(Activity context,ArrayList<Word> words){}//.......@NonNull@OverridepublicView getView(finalint position,View convertView,ViewGroupgroup){//.......ImageButton deleteBt = listItemView.findViewById(R.id.word_delete_bt);
deleteBt.setOnClickListener(newView.OnClickListener(){@Overridepublicvoid onClick(View v){if(vocabDb.deleteWord(currentWord.id)){//.....}else{//.....}remove(getItem(position));// <---- here is the trick ---<//clear() // if you want to clear everything}});//....
Catatan: di sini remove()dan getItem()metode diwarisi dari kelas Adapter.
remove() - untuk menghapus item tertentu yang diklik
getItem(position) - adalah untuk mendapatkan item (di sini, itu objek Word saya yang telah saya tambahkan ke daftar) dari posisi yang diklik.
Ini adalah bagaimana saya mengatur adaptor ke tampilan daftar di kelas aktivitas,
Jawaban:
Panggil
notifyDataSetChanged()
pada AndaAdapter
objek setelah Anda memodifikasi data dalam adaptor yang.Beberapa spesifikasi tambahan tentang bagaimana / kapan menelepon
notifyDataSetChanged()
dapat dilihat di video Google I / O ini .sumber
Anda juga dapat menggunakan ini:
sumber
invalidateViews()
dalam set kode sumbermDataChanged = true;
jadi saya tidak yakin apakah ini menghasilkan kinerja yang lebih baik dibandingkan dengannotifyDataSetChanged()
Harap mengabaikan semua
invalidate()
,invalidateViews()
,requestLayout()
, ... jawaban untuk pertanyaan ini.Hal yang benar untuk dilakukan (dan untungnya juga ditandai sebagai jawaban yang benar) adalah memanggil
notifyDataSetChanged()
Adaptor Anda .Penyelesaian masalah
Jika panggilan
notifyDataSetChanged()
tidak berfungsi, semua metode tata letak tidak akan membantu. PercayalahListView
itu telah diperbarui dengan benar. Jika Anda gagal menemukan perbedaannya, Anda perlu memeriksa dari mana data di adaptor Anda berasal.Jika ini hanya koleksi yang Anda simpan di memori, periksa apakah Anda benar-benar menghapus atau menambahkan item ke koleksi sebelum memanggil
notifyDataSetChanged()
.Jika Anda bekerja dengan database atau layanan backend Anda harus memanggil metode untuk mengambil kembali informasi (atau memanipulasi data dalam memori) sebelum memanggil
notifyDataSetChanged()
.Masalahnya adalah ini
notifyDataSetChanged
hanya berfungsi jika dataset telah berubah. Jadi itulah tempat untuk mencari jika Anda tidak menemukan perubahan yang terjadi. Debug jika dibutuhkan.ArrayAdapter vs BaseAdapter
Saya menemukan bahwa bekerja dengan adaptor yang memungkinkan Anda mengelola koleksi, seperti BaseAdapter berfungsi lebih baik. Beberapa adaptor seperti ArrayAdapter sudah mengelola koleksi mereka sendiri sehingga menyulitkan untuk mendapatkan koleksi yang tepat untuk pembaruan. Ini sebenarnya hanya lapisan kesulitan tambahan yang tidak perlu dalam kebanyakan kasus.
Utas UI
Benar bahwa ini harus dipanggil dari utas UI. Jawaban lain memiliki contoh tentang cara mencapai ini. Namun ini hanya diperlukan jika Anda mengerjakan informasi ini dari luar utas UI. Itu dari layanan atau utas non UI. Dalam kasus sederhana, Anda akan memperbarui data dari klik tombol atau aktivitas / fragmen lain. Jadi masih dalam utas UI. Tidak perlu selalu memunculkan runOnUiTrhead itu.
Proyek Contoh Cepat
Dapat ditemukan di https://github.com/hanscappelle/so-2250770.git . Cukup klon dan buka proyek di Android Studio (gradle). Proyek ini memiliki MainAcitivity yang membangun
ListView
dengan semua data acak. Daftar ini dapat di-refresh menggunakan menu aksi.Implementasi adaptor yang saya buat untuk contoh ini ModelObject memperlihatkan pengumpulan data
Kode dari MainActivity
Informasi Lebih Lanjut
Posting bagus lainnya tentang kekuatan listViews dapat ditemukan di sini: http://www.vogella.com/articles/AndroidListView/article.html
sumber
adapter.clear()
, danadapter.addAll(Array<T>)
sebelum meneleponnotifyDataSetChanged()
Panggil runnable kapan pun Anda mau:
OnCreate()
, Anda menetapkan utas runnable Anda:sumber
runOnUiThread()
fungsi.run = new Runnable()
dan hanya memberi saya fungsipublic void refreshUIThread()
metode yang memodelkanrun()
metode Anda (yang berfungsi juga).saya mendapat beberapa masalah dengan penyegaran dinamis dari tampilan daftar saya.
notifyDataSetChanged () tidak berfungsi dengan baik dalam kasus saya [saya memanggil notifyDataSetChanged dari kelas lain]. Hanya dalam kasus saya mengedit ListView di Activity (Thread) yang sedang berjalan. Video itu berkat Christopher memberi petunjuk terakhir.
Di kelas kedua saya digunakan
untuk mengakses pembaruan () dari Aktivitas saya. Pembaruan ini termasuk
untuk memberitahu Adaptor untuk menyegarkan tampilan. Bekerja dengan baik sejauh yang bisa saya katakan.
sumber
Jika Anda menggunakan SimpleCursorAdapter coba panggil requery () pada objek Cursor.
sumber
jika Anda masih tidak puas dengan Refreshment ListView, Anda dapat melihat potongan ini, ini untuk memuat listView dari DB, Sebenarnya yang harus Anda lakukan hanyalah memuat ulang ListView, setelah Anda melakukan Operasi CRUD. Ini bukan cara terbaik untuk kode, tetapi akan menyegarkan ListView seperti yang Anda inginkan ..
Ini bekerja untuk Saya .... jika Anda menemukan solusi yang lebih baik, silakan Bagikan ...
sumber
Solusi yang diajukan oleh orang-orang di pos ini berfungsi atau tidak terutama tergantung pada versi Android perangkat Anda. Sebagai Contoh untuk menggunakan metode AddAll Anda harus meletakkan android: minSdkVersion = "10" di perangkat android Anda.
Untuk mengatasi pertanyaan ini untuk semua perangkat yang saya buat metode saya sendiri di adaptor saya dan gunakan di dalam metode add and remove yang diwarisi dari ArrayAdapter yang memperbarui data Anda tanpa masalah.
Kode Saya: Menggunakan kelas data saya sendiri RaceResult, Anda menggunakan model data Anda sendiri.
ResultGpRowAdapter.java
ResultsGp.java
sumber
Jika Anda ingin mempertahankan posisi gulir saat menyegarkan, dan Anda dapat melakukan ini:
Untuk informasi detail, silakan lihat Android ListView: Pertahankan posisi gulir Anda saat menyegarkan .
sumber
Cukup gunakan
myArrayList.remove(position);
di dalam pendengar:sumber
Anda perlu menggunakan satu objek dari daftar itu yang mengumpulkan data yang Anda kembangkan
ListView
. Jika referensi berubah maka tidaknotifyDataSetChanged()
berfungsi. Kapan pun Anda menghapus elemen dari tampilan daftar, hapus juga dari daftar yang Anda gunakan apakah itu ArrayList <> atau Sesuatu yang lain maka PanggilnotifyDataSetChanged()
objek kelas adaptor Anda.Jadi di sini lihat bagaimana saya mengaturnya di adaptor saya lihat di bawah
sumber
Setelah menghapus data dari tampilan daftar, Anda harus menelepon
refreshDrawableState()
. Berikut ini contohnya:dan
deleteContact
metode diDatabaseHelper
kelas akan agak miripsumber
Saya tidak bisa mendapatkan notifyDataSetChanged () untuk bekerja memperbarui SimpleAdapter saya, jadi alih-alih saya mencoba menghapus semua tampilan yang dilampirkan ke tata letak induk menggunakan removeAllViews (), kemudian menambahkan ListView, dan yang berfungsi, memungkinkan saya untuk memperbarui UI:
sumber
Bagi saya setelah mengubah informasi dalam basis data sql tidak ada yang bisa menyegarkan tampilan daftar (menjadi tampilan daftar yang dapat diperluas) jadi jika notifyDataSetChanged () tidak membantu, Anda dapat mencoba untuk menghapus daftar Anda terlebih dahulu dan menambahkannya lagi setelah panggilan notifyDataSetChanged (). Sebagai contoh
Semoga ini masuk akal untuk Anda.
sumber
saat menggunakan SimpleCursorAdapter dapat memanggil changeCursor (newCursor) pada adaptor.
sumber
Saya sama ketika, dalam sebuah fragmen, saya ingin mengisi ListView (dalam satu TextView) dengan alamat mac perangkat BLE yang dipindai selama beberapa waktu.
Apa yang saya lakukan adalah ini:
Kemudian ListView mulai mengisi secara dinamis dengan alamat mac perangkat yang ditemukan.
sumber
Saya pikir itu tergantung pada apa yang Anda maksud dengan penyegaran. Maksud Anda tampilan GUI harus di-refresh, atau apakah maksud Anda bahwa tampilan anak-anak harus di-refresh sedemikian rupa sehingga Anda dapat memanggil getChildAt (int) secara terprogram dan mendapatkan tampilan yang sesuai dengan apa yang ada di Adaptor.
Jika Anda ingin tampilan GUI di-refresh, maka panggil notifyDataSetChanged () pada adaptor. GUI akan disegarkan saat selanjutnya digambar ulang.
Jika Anda ingin dapat memanggil getChildAt (int) dan mendapatkan tampilan yang mencerminkan apa yang ada di adaptor, maka panggil ke layoutChildren (). Ini akan menyebabkan tampilan anak direkonstruksi dari data adaptor.
sumber
Saya memiliki ArrayList yang ingin saya tampilkan di listview. ArrayList mengandung elemen dari mysql. Saya mengganti metode onRefresh dan dalam metode itu saya menggunakan tablelayout.removeAllViews (); dan kemudian mengulangi proses untuk mendapatkan data lagi dari database. Tapi sebelum itu pastikan untuk menghapus ArrayList Anda atau apa pun struktur data atau data baru akan ditambahkan ke yang lama ..
sumber
Jika Anda ingin memperbarui tampilan daftar tampilan UI dari layanan, maka buat adaptor statis di aktivitas Utama Anda dan lakukan ini:
sumber
Jika Anda menggunakan garis panduan Android dan Anda menggunakan
ContentProviders
untuk mendapatkan data dariDatabase
dan Anda menampilkannya dalamListView
menggunakanCursorLoader
danCursorAdapters
, maka Anda semua perubahan pada data terkait akan secara otomatis tercermin dalam ListView.Anda
getContext().getContentResolver().notifyChange(uri, null);
di kursor di jendelaContentProvider
akan cukup untuk mencerminkan perubahan. Tidak perlu untuk bekerja ekstra.Tetapi ketika Anda tidak menggunakan ini semua maka Anda harus memberi tahu adaptor ketika dataset berubah. Anda juga perlu mengisi ulang / memuat ulang dataset Anda (katakanlah daftar) dan kemudian Anda perlu menelepon
notifyDataSetChanged()
adaptor.notifyDataSetChanged()
tidak akan berfungsi jika tidak ada perubahan pada datset. Berikut adalah komentar di atas metode dalam dokumen-sumber
Saya hanya bisa mendapatkan notifyDataSetChanged hanya dengan mendapatkan data adaptor baru, kemudian mengatur ulang adaptor untuk tampilan daftar, lalu membuat panggilan seperti:
sumber
pada pilihan lain adalah
onWindowFocusChanged
metode, tetapi yakin itu sensitif dan membutuhkan beberapa pengkodean tambahan untuk siapa yang tertariksumber
Pertimbangkan Anda telah mengirimkan daftar ke adaptor Anda.
Menggunakan:
list.getAdapter().notifyDataSetChanged()
untuk memperbarui daftar Anda.
sumber
Jika saya berbicara tentang skenario saya di sini, jawaban di atas tidak akan berfungsi karena saya memiliki aktivitas yang menampilkan daftar nilai db bersama dengan tombol hapus dan ketika tombol hapus ditekan, saya ingin menghapus item itu dari daftar.
Yang keren adalah, saya tidak menggunakan tampilan pendaur ulang tetapi tampilan daftar sederhana dan tampilan daftar yang diinisialisasi di kelas adaptor. Jadi, memanggil
notifyDataSetChanged()
tidak akan melakukan apa pun di dalam kelas adaptor dan bahkan di kelas aktivitas di mana objek adaptor diinisialisasi karena metode hapus berada di kelas adaptor.Jadi, solusinya adalah menghapus objek dari adaptor dalam
getView
metode kelas adaptor (untuk hanya menghapus objek tertentu tetapi jika Anda ingin menghapus semua, panggilclear()
).Bagi Anda untuk mendapatkan ide, seperti apa kode saya,
Catatan: di sini
remove()
dangetItem()
metode diwarisi dari kelas Adapter.remove()
- untuk menghapus item tertentu yang diklikgetItem(position)
- adalah untuk mendapatkan item (di sini, itu objek Word saya yang telah saya tambahkan ke daftar) dari posisi yang diklik.Ini adalah bagaimana saya mengatur adaptor ke tampilan daftar di kelas aktivitas,
sumber
Cara termudah adalah dengan hanya membuat Adaper baru dan drop yang lama:
sumber