Android 之 adapter.notifyDataSetChanged() 無響應
今天開發Android遇到一個問題,就是adapter.notifyDataSetChanged() 後,列表並無變化。第一開始的程式碼片段是這樣的:(簡化後的,大家知道意思即可)
listItem = new ArrayList(); //listItem 為儲存List中每個item的值的變數。
adapter.notifyDataSetChanged() ;
為了找出原因,我把listItem = new ArrayList(); 改為listItem.remove(0);或者listItem.clear();發現列表做出了相應的變化。
總結以下三個要點:
1. 這兩個的區別是:listItem = new ArrayList() 並未改變源資料,而是新建立一個資料段,並將這個新資料段的引用賦給listItem(因為listItem是一個引用)。源資料依舊存在且沒有發生變化。而remove(),clear()方法,是改變了源資料。
2. Adapter在初始化時,比如SimpleAdapter simpleAdapter = new SimpleAdapter(context, List<E>, xml_id, String[], int[] );其中,List<E>是傳遞的資料,而因為List在傳遞時,傳遞的是引用,所以,listItem = new ArrayList() 並未改變Adapter中指向的資料。
3. notifyDataSetChanged()方法檢測的是Adapter初始化時傳遞的引用的資料是否改變,而不是listItem所指向的資料是否改變。這也導致了列表沒有發生變化。
解決後的程式碼:
listItem.clear();
listItem.add(new ArrayList());
adapter.notifyDataSetChanged() ;
還有一種使用notifyDataSetInvalidated()方法可使用,在此不再深究。
以上敘述如有差誤,請大家指出,謝謝!
相關文章
- android adapter.notifyDataSetChanged 資料重新整理無效AndroidAPT
- Finder持續無響應怎麼辦?Finder無響應解決教程
- Android之點選兩次才響應onclick方法Android
- [Android]關於Android子view超出父view無法響應點選事件AndroidView事件
- mac電腦無響應怎麼辦?教你如何強制退出Mac無響應程式Mac
- Android響應式佈局Android
- MySQL表操作超時無響應MySql
- Androidstudio開啟無響應Android
- tomcat 443埠無響應,急!!!!Tomcat
- win10桌面假死無響應怎麼辦 win10桌面假死無響應的方法Win10
- 徹底理解安卓應用無響應機制安卓
- DRF之請求與響應
- npm install 無響應解決方案NPM
- 解決IIS無響應假死狀態
- sqlplus 無響應 hang處理SQL
- Android 軟鍵盤響應事件解析Android事件
- 天擎 電腦當機、無響應、無法登入
- 教你如何強制退出Mac無響應程式Mac
- 使用 sail 執行 artisan 等命令無響應AI
- tomcat服務無響應堆疊分析Tomcat
- Oracle 執行 DDL 長時間無響應Oracle
- Ubuntu 7.10 鍵盤時常無響應Ubuntu
- 如何解決網頁無響應問題網頁
- 應用程式無響應?如何在Mac上強制退出應用Mac
- clover在win10下無響應如何處理_clover在win10下無響應怎麼修復Win10
- 過載android返回鍵響應函式Android函式
- BeetleX之webapi自定義響應內容WebAPI
- Android之無法回撥onActivityResultAndroid
- Android開發之道(7)響應鍵盤事件Android事件
- win10電腦點選滑鼠右鍵無法響應無反應如何解決Win10
- 蘋果mac電腦怎麼退出無響應卡死的應用程式蘋果Mac
- vs軟體win10無響應怎麼辦_win10電腦vs軟體經常無響應解決方法Win10
- 如何解決Finder持續無響應的問題
- win8程式無響應的解決辦法
- Win10工作列卡死,無響應,點不動Win10
- web響應式佈局之 meta詳解Web
- FastAPI基礎之 額外的響應模型ASTAPI模型
- 響應式程式設計簡介之:Reactor程式設計React