今天在寫一個顯示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