編輯:關於Android編程
效果圖:
可以看到,一打開Activity,看到10個item.
我們看看Log信息:
可以看出,每次convertView都是null, 都是新建一個View來顯示的。
當我們向下滑動,如下圖,
由於item0和item10都顯示一半,所以item10也是新建出來,但是當要顯示item11的時候,由於item0已經不在屏幕上,所以item11復用了item0的實例。可以從以下Log信息看出:
我們分析Log信息,可以看出item11的對象是item0, item12的對象是item1,如此類推。
這樣,通過復用convertView,就可以避免每次都新建View,節省內存而且優化ListView的滑動效果。
2. ListView的Layout XML可以看出,修改之後ListView的getView調用恢復和Recycler的行為一致。
至於為什麼使用wrap_content會出現重復調用的情況,我還沒有研究過。不過初步覺得是因為在Android描繪ListView的時候,由於不清楚高度,所以使用一個item去試探ListView在屏幕中的最大高度所引起。希望有知道的朋友能夠告訴,先謝謝了!
最後,如果上面有什麼地方說錯的話,希望能夠指出,互相進步嘛。
補充:
在接著使用ListView的時候,又發現一個很奇怪的現象。調用notifyDataSetChanged()之後,ListView在重新getView()時,所有的convertView的順序都逆序了。請看下面截圖:
這應該是由於recycleBin是stack結構而引起。
其它:
1. Disable divider:
android:divider="#00000000"
android:dividerHeight="0dp"
2. Disable ListView selector:
convertView.setOnClickListener(null);
如果只是要去掉顏色,可以用android:listSelector="#00000000"
3. Disable header divider:
android:headerDividersEnabled="false"
4. getItemViewType(int)與getItemViewType(int)
getItemViewType(int) can not return int value larger than getViewTypeCount().
Otherwise you will get java.lang.ArrayIndexOutOfBoundsException at android.widget.AbsListView$RecycleBin.addScrapView(AbsListView.java:3523)
ListView會根據不同的ViewType返回相應type的convertView.
一般寫法:
復制代碼 代碼如下:
getView() {
switch (getItemViewType(position)) {
case type1:
if(convertView == null) {
} else {
}
break;
case type2:
default:
if(convertView == null) {
} else {
}
break;
}
return convertView;
}
getItemViewType(int position) {
// 根據場景,一般有:
// 1. 不同的item type對應的position是固定的,那麼ListView的data可以分別存放
// 2. 不同的item type對應的position是不固定的,那麼可以把ListView的data統一放在List<Object>中,
// 然後使用instanceof來判斷Object的類型進而區分position對應的view type.
}
在手機應用中,用戶點擊回退按鈕一般是返回上個頁面,一般頁面不用處理,如果在首頁,點回退,沒任何提示,就把應用給關了,這個用戶體驗就不太好了,所以一般都會給用戶一個確認的提
知識點目錄 5.1 滑動效果是如何產生的 5.1.1 Android坐標系 5.1.2 視圖坐標系 5.1.3 觸控事件——MotionEvent
Android中的動畫分為視圖動畫(View Animation)、屬性動畫(Property Animation)以及Drawable動畫。從Android 3.0(A
上一篇文章對MVC框架模式做了簡要概述並且在文章的最後給出了MVC3個組件之間相互工作的邏輯圖,在本文我們將進一步對模型(model)-視圖(view)-控制器(cont