1. 程式人生 > >ListView notifyDataSetChanged不起作用 資料不更新的原因

ListView notifyDataSetChanged不起作用 資料不更新的原因



在動態重新整理ListView時,使用notifyDataSetChanged並沒有起到作用。有時會被困擾得很痛苦。

其實,在使用notifyDataSetChanged過程中,還是有細節需要注意的。舉個例子:

我的ListView使用的資料來源是來自ArrayList。通常我們的做法是建立一個已經有我們想要提供給ListView的資料的ArrayList,例如:

ArrayList<Integer> list  = new ArrayList<Interger>;
list.add(1);

這裡我們的list已經是指向了一個堆記憶體上了。接著我們想要改變list中的資料,而這個時候,就需要注意了,舉個例子:我們在程式碼中有另外一個ArrayList叫做newlist,它是使用下面程式碼創建出來的:

ArrayList<Integer> newlist  = new ArrayList<Interger>;
list.add(2);

這個時候,newlist指向的是一個和list指向不同的堆記憶體,這個時候,我們直接用list = newlist來把newlist的資料交給list,在這裡,實際上只是把list的指向改變了,讓它也指向newlist指向的那個記憶體。那麼這個時候我們再呼叫notifyDataSetChanged這個方法來通知listview更新資料就起不了任何作用了,原因很簡單,就是list的指向已經改變,而呼叫notifyDataSetChanged會去檢查原來list指向的資料是否變化,但是這時的list已經不是原來的list了,所以它無法判斷,只能不作出響應了。那麼,這個問題的解決方法是直接在原來的list上面更改資料,可以使用下面的程式碼來操作:

list.clear();
list.addAll(newlist);
adapter.notifyDataSetChanged();

這樣,list的指向就不會改變,它還是指向原來那塊記憶體,這樣呼叫notifyDataSetChanged()就可以起作用了。

總結:在這裡的重點就是要注意在開始時傳給ListView的list指向不能被改變,需要從始至終指向同一個記憶體,這樣呼叫notifyDataSetChanged後就能夠檢測到list的資料變化,從而觸發ListView的重新繪製了!

相關推薦

ListView notifyDataSetChanged作用 資料更新原因

 在動態重新整理ListView時,使用notifyDataSetChanged並沒有起到作用。有時會被困擾得很痛苦。 其實,在使用notifyDataSetChanged過程中,還是有細節需要注意的。舉個例子: 我的ListView使用的資料來源是來自ArrayLis

導致spring事務配置作用的一種原因

red something 事務配置 nbsp oid -s color con bsp @Component public class AnalyticsApplication { @Autowired private InitializationAc

SSM框架事務管理作用回滾的原因之一

如果當框架搭建完成,並反覆確認框架的配置檔案、事務宣告都沒有問題,但就是不會滾。 原配置檔案如下: springmvc的配置檔案 <context:component-scan base-package="com.dncps.*" />

Atitit Spring事務配置作用可能出現的問題: .是否是資料庫引擎設定不對造成的【筆者就遇到了這個問題,由於筆者使用的是mysql資料,但是在建立表的時候引擎預設(mysql中引擎預設為

Atitit Spring事務配置不起作用可能出現的問題:   .是否是資料庫引擎設定不對造成的【筆者就遇到了這個問題,由於筆者使用的是mysql資料,但是在建立表的時候引擎預設(mysql中引擎預設為MyISAM,是不支援事務操作的),需要修改為InnoDB,就可以支援事務操作了

vsCode更新之後變成中文版,怎麼設定英文。Mac配置中文作用

可配置 中文版 按 ctrl+shift+p  搜尋:Configore Display Language  修改"locale":"zh-CN"為"locale":"en-Us" 如需配置中文輸入:   zh-CN

js設定剪貼簿資料 event.clipboardData.setData("text/plain",value);作用,並非所有的瀏覽器都支援,限制了

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> &

Element UI 中清除初始化資料為空時this.$refs[formName].resetFields()作用

問題 在查詢條件中,初始化時繫結手機號碼值從cookie中獲取,但是在清除表單的時候,只用this.$refs[formName].resetFields()無法清楚所有表單為空。 分析原因 this.$refs[formName].resetFiel

RecyclerView.Adapter notifyDataSetChanged 作用

最近專案裡要添加個聊天功能,我們使用的是環信SDK。 如果應用啟動,不在聊天介面,接收到訊息後就彈出通知欄訊息通知使用者,點選進入聊天介面。 如果使用者已經在聊天介面,就要將接收到的資料新增到adapter裡,動態顯示訊息。 問題卡在,接收到訊息後呼叫更新

Android-ListView中巢狀(ListView)控制元件時item的點選事件作用的問題

解決:1、在主listview佈局檔案中的listview中新增屬性 android:focusable="false"              2、在子listview中最頂上的佈局檔案新增屬性

mkdir中設定資料夾訪問許可權作用

問題描述: 在使用下面函式設定資料夾訪問許可權時,發現建立的資料夾的訪問許可權其實不是自己傳進去的mode許可權。 int mkdir(const char *pathname, mode_t mode) 原因解釋如下: man 2 mkdir 告訴我們:The  arg

spring事務、當業務中並沒有異常丟擲時執行一半的事務無法正常出發導致資料一致性遭到破壞、事務作用

spring 事務:當所攔截的方法有指定錯誤丟擲的時候觸發事務的執行。 有些情況下正常開發的業務並沒有異常的發生、但是業務要求並沒有滿足的時候並不會有異常的產生。這個時候需要我們自己手動丟擲異常。觸發事務、保證資料的一致性。 手動丟擲異常有兩種方式: 一:手動丟擲異常:

android的listview中setselection()作用的解決方案

遇到一個很詭異的問題,ListView資料沒有更改之前,setselection()方法呼叫效果一切正常;而填充資料更改之後,同樣的程式碼片段卻莫名其妙無效了。 先列出搜尋到網上的解決方法: 來源:http://stackoverflow.com/questions/14

Android 解決 adapter.notifyDataSetChanged() 作用

使用 Listview 的時候,給 adapter 的資料來源 List 添加了新的資料,然後呼叫 adapter.notifyDataSetChanged(),發現 listview 並沒有顯示出新增的資料,但是遍歷輸出 List 中的元素,發現新增資料已

textArea中的placeholder屬性作用

問題 img tex text tro pan str ext textarea 問題描述: textarea中加的placeholder屬性有給值,但是在jsp頁面中沒有對應的提示信息顯示,如下圖所示: 原因: <textarea>與</texta

AutoCAD 許可管理器作用,或未正確安裝,現在將關閉

選擇 分享 log eight src ref 問題 通過 重新安裝 問題描述 重新安裝了也還是這樣,而且第二次打開都跳不出申請碼界面就關閉了。 問題原因,初步認為:AutoCAD 在首次彈出申請激活類型的類型時,直接選擇了網絡激活,而且沒有激活成功。再

SpringBoot學習遇到的問題(1) - 配置文件有日誌的debug模式等配置項,為什麽作用

boot lease bug fig spa stack 不起作用 網站 cat 這個問題困擾我近乎兩天,通過查找N多資料後終於解決,寫下來共享給大家。 logging.level.root=DEBUG ... 一系列的日誌配置項,都不起作用的原因是springboot啟動

left outer join的on作用

oci join microsoft nbsp mysq soft sel asp msdn left outer join的on不起作用 https://msdn.microsoft.com/zh-cn/library/ms177634.aspx?f=255&am

CSS 中first-child和last-child作用原因

clas 第一個 元素 col 沒有 XML last 發的 n) 今天開發的時候,發現last-child不起作用,看了下原因順便給自己學習CSS選擇器,我們這裏舉個例子,如下代碼:<div><h1>title</h1> <p&g

鼠標滾輪圖片放大縮小功能,使用layer彈框後作用

src con ext 顯示 想是 它的 max msg 隨著 今天在項目中遇到的一個問題:點擊按鈕使用layer彈框彈出一張圖片,需要加一個鼠標滾輪放大縮小,圖片也跟著放大縮小的功能。於是在網上找了一個demo。 DEMO: 1 <!DOCTYPE html P

vue雙向綁定時添加.sync作用原因

component 2.0 雙向 例子 不同 版本 name 但是 vue <my-component v-bind:my-name.sync="name" v-bind:my-age.sync="age"></my-component> 以上代碼是