天天看點

Android使用notifyDataSetChanged重新整理擴充卡資料無效

今天在寫一個顯示wifi信号強度的頁面時候,發現在重新整理資料的時候,無論如何都無法重新整理。

在網上找了一些答案後才發現了問題所在。

srlist = wifiAdmin.getAllNetWorkList();
    wifiadapter = new WifiSignalAdapter(srlist,app);
    wifiList.setAdapter(wifiadapter);
           

我在上面是通過一個wifiAdmin的工具類的getAllNetWorkLis()方法擷取所有的wifi資訊清單,

然後 我線上程中寫的是

`

while( !isStop){
                if(wifiAdmin.isOpenWifi()){
                    //建立一個更新UI的線程來更新ui
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            //打開wifi後  擷取目前的wifi信号清單并且搭載資料
                            srlist = wifiAdmin.getAllNetWorkList();
                            wifiadapter.notifyDataSetChanged();

                        }
                    });
                }else{
                    //目前未打開wifi
                    wifiList.setAdapter(null);
                }

                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
           

`

然後, 我發現無論線程怎麼跑 就是無法重新整理listview的資料。

百度了很久之後,發現一片部落格上面寫的是

對于一個listview,當我們把資訊存放到一個List連結清單中時,然後又對這個連結清單進行流排序,最後去重新整理擴充卡發現無改變,原因為咱們改變流連結清單中值得位置,但沒有改變值在記憶體中所儲存的位址,即引用沒有改變,是以我們可以對adapter再new 一次,然後setAdapter 到相應的ListVeiw或者GridView即可解決問題。

看到這裡 我才恍然大悟,明白了錯的原因在于我每次都是使用 srlist = wifiAdmin.getAllNetWorkList(); 按照上面的說法就是 咱們改變流連結清單中值得位置,但沒有改變值在記憶體中所儲存的位址,即引用沒有改變,也就是說,這個srlist被new過一次後 再次去new這個srlist的變量,擴充卡指向的還是以前的那個srlist位址而不是新new出來的srlist位址

那麼,我們能不能不改變存儲位址的情況下解決這個問題呢?

我接下來是這麼改的

“`

while( !isStop){

if(wifiAdmin.isOpenWifi()){

//建立一個更新UI的線程來更新ui

runOnUiThread(new Runnable() {

@Override

public void run() {

//打開wifi後 擷取目前的wifi信号清單并且搭載資料

List newlist = wifiAdmin.getAllNetWorkList();

srlist.clear();

srlist.addAll(newlist);

wifiadapter.notifyDataSetChanged();

                        }
                    });
                }else{
                    //目前未打開wifi
                    wifiList.setAdapter(null);
                }

                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
           

現在,再運作一遍,發現有用了。

這種方法其實就是一種“曲線救國”的解法…..還有一種思路是

擴充卡裡面寫個重新整理資料方法,然後在裡面替換新資料後調notifydatachange

或者其他的,解決問題的方法很多,但是總的來說就像我同學說的那樣

“黑貓白貓能抓老鼠就是好貓”

順帶感謝論壇裡面的其他前輩大佬

參考部落格 https://blog.csdn.net/yangyong915/article/details/41593069