adapter資料來源與更新機制

2022-08-26 08:30:09 字數 1870 閱讀 2691

在呼叫adapter的notifydatasetchanged更新列表元件時候,實際上就是呼叫adpater的getview方法重新獲取頁面的各個元素的過程,因為呼叫notify的時候,填充頁面的list資料來源往往發生了變化,那麼getview得到的資料也就不一樣了,所以介面就會發生改變。例如,我定義乙個apater類:

public

class myadapter extends

baseadapter

@override

private getview()

}

這時候我在activity裡傳入乙個list,ok沒錯,每當我傳入的list放生改變的時候,呼叫notify重新整理都沒有錯。

但是最近做工程的時候,我建立了乙個nodetree類,為了方便,在adaper裡使用的是nodetree的nodes的list,看**

public

class nodetree extends

linearlayout

public

class myadapter extends

baseadapter

@override

private

getview()

}

然後,我再nodetree裡邊對list進行增刪改查,然後通知adapter重新整理,理論上應該沒問題,但是刪除時候卻出現了問題,介面不重新整理!沒辦法,最後只得將資料的形式重新改為了一圖所示的格式,即資料來源直接放在adapter裡邊,重新整理是肯定沒有問題的,而且這樣做的耦合性會好很多。

第二,再來學習一下重新整理單個列表項的方法吧,雖然目前為止還沒有用到,但是難保將來不會用到,未雨綢繆,當然是極好的。

其實,單條重新整理機制的核心就是如何找到自己要更新的item,並手動呼叫getview去更新。

adpter類,很簡單,就是利用乙個convertview

public

class myadapter extends

baseadapter

@override

public

intgetcount()

@override

public object getitem(int

position)

@override

public

long getitemid(int

position)

@override

public view getview(int

position, view convertview, viewgroup parent)

((textview)convertview).settext(name);

return

convertview;

}}

然後在activity中寫了乙個refresh類,手動重新整理需要更新的資料,這裡需要用到幾個平時不怎麼見到的方法

public

class mainactivity extends

activity

/***替換當前視野中的某個元素

**/

private

void singlerefresh(int

id) }}}

public

void

refresh(view v)

}

需要注意:在listview中,使用getchildat(index)的取值,只能是當前可見區域(列表可滾動)的子項! 

即取值在  listview.getfirstvisibleposition()~listview.getlastvisibleposition()之間

MFC選單命令更新機制

1 mfc當要顯示選單時,作業系統會發出wm initmenupopup訊息,然後由程式視窗的基類接管。此時會建立乙個ccmdui物件,並與程式的第乙個選單相互關聯,呼叫該物件的乙個成員函式doupdate 這個函式發出on update command ui訊息。這條訊息帶有乙個指向ccmdui物...

Oscache的強行更新機制

背景 在產品中也許不需要強行更新,但是測試的時候往往需要。part 1 當你強行更新快取時會發生如下步驟 step1 generalcacheadministrator.flushall step2 cache.flushall date date,string origin flushall的源 ...

Oscache的強行更新機制

背景 在產品中也許不需要強行更新,但是測試的時候往往需要。part 1 當你強行更新快取時會發生如下步驟 step1 generalcacheadministrator.flushall step2 cache.flushall date date,string origin flushall的源 ...