在呼叫adapter的notifydatasetchanged更新列表元件時候,實際上就是呼叫adpater的getview方法重新獲取頁面的各個元素的過程,因為呼叫notify的時候,填充頁面的list資料來源往往發生了變化,那麼getview得到的資料也就不一樣了,所以介面就會發生改變。例如,我定義乙個apater類:
publicclass myadapter extends
baseadapter
@override
private getview()
}
這時候我在activity裡傳入乙個list,ok沒錯,每當我傳入的list放生改變的時候,呼叫notify重新整理都沒有錯。
但是最近做工程的時候,我建立了乙個nodetree類,為了方便,在adaper裡使用的是nodetree的nodes的list,看**
publicclass nodetree extends
linearlayout
publicclass myadapter extends
baseadapter
@override
private
getview()
}
然後,我再nodetree裡邊對list進行增刪改查,然後通知adapter重新整理,理論上應該沒問題,但是刪除時候卻出現了問題,介面不重新整理!沒辦法,最後只得將資料的形式重新改為了一圖所示的格式,即資料來源直接放在adapter裡邊,重新整理是肯定沒有問題的,而且這樣做的耦合性會好很多。
第二,再來學習一下重新整理單個列表項的方法吧,雖然目前為止還沒有用到,但是難保將來不會用到,未雨綢繆,當然是極好的。
其實,單條重新整理機制的核心就是如何找到自己要更新的item,並手動呼叫getview去更新。
adpter類,很簡單,就是利用乙個convertview
publicclass 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類,手動重新整理需要更新的資料,這裡需要用到幾個平時不怎麼見到的方法
publicclass 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的源 ...