1. 程式人生 > >Android中ListView滑動時資料混亂

Android中ListView滑動時資料混亂

主要分析Android ListView滾動過程中圖片顯示重複、錯亂、閃爍的原因及解決方法,順帶提及ListView的快取機制。
1、原因分析
ListView item快取機制
:為了使得效能更優,ListView會快取行item(某行對應的View)。ListView通過adapter的getView函式獲得每行的item。滑動過程中,

a. 如果某行item已經滑出螢幕,若該item不在快取內,則put進快取,否則更新快取;
b. 獲取滑入螢幕的行item之前會先判斷快取中是否有可用的item,如果有,做為convertView引數傳遞給adapter的getView。
更具體可見原始碼

ListView.obtainView

這樣,如下的getView寫法就可以充分利用快取大大提升ListView的效能。即便上萬個行item,最多inflate的次數為n,n為一屏最多顯示ListView 行item的個數。

ListView Adapter getView寫法 Java
123456789101112131415161718192021222324@OverridepublicView getView(intposition,View convertView,ViewGroup parent){ViewHolder holder;if(convertView
==null){convertView=inflater.inflate(R.layout.list_item,null);holder=newViewHolder();……convertView.setTag(holder);}else{holder=(ViewHolder)convertView.getTag();}}/** * ViewHolder * * @author [email protected] 2013-08-01 */privatestaticclassViewHolder{ImageView appIcon;TextView  appName;TextView  appInfo
;}

這樣提升了效能,但同時也會造成另外一些問題:

a. 行item圖片顯示重複
這個顯示重複是指當前行item顯示了之前某行item的圖片。
比如ListView滑動到第2行會非同步載入某個圖片,但是載入很慢,載入過程中listView已經滑動到了第14行,且滑動過程中該圖片載入結束,第2行已不在螢幕內,根據上面介紹的快取原理,第2行的view可能被第14行復用,這樣我們看到的就是第14行顯示了本該屬於第2行的圖片,造成顯示重複。

b. 行item圖片顯示錯亂
這個顯示錯亂是指某行item顯示了不屬於該行item的圖片。
比如ListView滑動到第2行會非同步載入某個圖片,但是載入很慢,載入過程中listView已經滑動到了第14行,第2行已不在螢幕內,根據上面介紹的快取原理,第2行的view可能被第14行復用,第14行顯示了第2行的View,這時之前的圖片載入結束,就會顯示在第14行,造成錯亂。

c. 行item圖片顯示閃爍
上面b的情況,第14行圖片又很快載入結束,所以我們看到第14行先顯示了第2行的圖片,立馬又顯示了自己的圖片進行覆蓋造成閃爍錯亂。

2、解決方法
通過上面的分析我們知道了出現錯亂的原因是非同步載入及物件被複用造成的,如果每次getView能給物件一個標識,在非同步載入完成時比較標識與當前行item的標識是否一致,一致則顯示,否則不做處理即可。
下面以使用ImageCache為ListView提供圖片獲取快取為例,ListView中強烈推薦使用ImageCache
首先在listview adapter的getView中新增

Java
1 2 3 4 5 6 7

相關推薦

AndroidListView滑動資料混亂

主要分析Android ListView滾動過程中圖片顯示重複、錯亂、閃爍的原因及解決方法,順帶提及ListView的快取機制。 1、原因分析 ListView item快取機制:為了使得效能更優,ListView會快取行item(某行對應的View)。ListView通過adapter的getV

Android Listview滑動不載入資料,停下來時載入資料,讓App更優

資料來源配置(Adapter) package com.zhengsonglan.listview_loading.adapter;  import android.content.Context;  import android.view.LayoutInflate

Android開發:在ListView使用RadioGroup出現混亂選中現象

重寫Adapter的getView方法(); 設定每個item中RadioGroup的監聽器(viewHolder.answerRg.setOnCheckedChangeListener()),每RadioGroup中有四個radiobutton表示A,B,C,D。

AndroidListView包含Button滑動丟失選中狀態的解決方法(二)

1.介面卡中的主要邏輯: import android.content.Context; import android.support.v4.content.ContextCompat; import android.text.TextUtils; import a

面試問題之:AndroidListView分頁載入資料

熟悉Android的朋友們都知道,不管是微部落格戶端還是新聞客戶端,都離不開列表元件,可以說列表元件是Android資料展現方面最重要的元件,我們今天就要講一講列表元件ListView載入資料的相關內容。通常來說,一個應用在展現大量資料時,不會將全部的可用資料都呈現給

關於AndroidListView的addHeaderView()的方法和ListView滑動不流暢的解決方法

xml佈局為ListView 呼叫ListView.addHeaderView(view)方法在ListView的上方新增其他元件,多次呼叫,則按順序從上向下羅列  其view是一個獨立的佈局檔案 如

AndroidListView實現展示列表資料

1、在activity_main.xml中新增一個ListView <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://sc

androidlistview分頁載入資料

               前段時間做的新浪微博專案一直想實現listview分頁載入資料,今天終於實現了,哈哈!感覺挺好的,今天又寫了個demo給大家分享下。               首先說下listview的優化方案,這也是面試中常考的題目。優化方案有三種:1,如

listview、gridview單項更新及滑動資料錯亂重複問題

前言 listview和gridview原理是一樣的,只是顯示方式不一樣。這裡我就以gridview來說明 首先,為什麼要單項更新?因為notifyDataSetChanged()方法是重新整理整個資料,當我們的資料量很大時,原本只需要重新整理一項,但是

AndroidListView的條目有button,item和button搶焦點問題

Android中ListView的條目中有button時,item的點選事件失效。 這個問題我總結了3點: 1、button的點選事件要寫在自定義介面卡中。 2、ListView條目點選事件要寫在Ac

ListView優化機制及滑動資料出現的資料錯亂重複問題

該篇內容主要是記錄我在實際開發中遇到的ListView滑動時資料錯亂的幾種情況,以及解決方法。在進行ListView滑動時資料錯亂問題討論之前會對ListView所謂的<優化>進行說明。文章末尾分享了幾篇文章,增強對ListView使用以及Adapter優化的理

AndroidView滑動實現方式

必須 elf 內部 track 視圖 相對 top roc mar 滑動作為Android中最基礎的特效之一,使用場景非常廣泛。實現的方式也有多種,理解各種滑動的實現方式。清楚在開發中根據自己的實際需求,選擇合理的實現方案。這篇文章從:scrollTo()/scroll

iOS UITableView 滑動順序混亂或多個cell內容相同

view sin 也會 一個隊列 section 一個 排序 一行 bsp 在使用UITableView時,由於cell的重用機制,在獲取後臺數據並填充cell時,會發生cell重復出現,界面紊亂。但這僅僅在擁有多個section的情況下會出現,沒有滾動的時候,單個se

AndroidListView點選onItemClick不響應,onTouch和onItemLongClick響應

這裡先說以下原因,我這裡的ListView不能點選,可能是跟執行緒更新UI有關,與獲取焦點之類無關。 程式裡的ListView設定了點選監聽setOnItemClickListener,長按監聽setOnItemLongClickListener,觸控監聽setOnTouchListener。

AndroidListView、GridView的通用適配封裝簡化程式碼

轉載請註明出處:http://blog.csdn.net/u013038616/article/details/50733935 ListView和GridView是我們平時經常用來展示集合資料,每次都要為每種列表建一個專門的適配,雖然建立介面卡灰常簡單,但是每次都會有很多類似的程式碼,作

AndroidListView的簡單使用

動態新增單行列表: 首先前提是你的佈局檔案裡有一個ListView 單行列表的新增只需要一個list集合即可,使用ArrayAdapter陣列介面卡繫結更新就行了 首先宣告一個ArrayAdapter物件: ArrayAdapter adapter adapter = new ArrayAdapter(

AndroidListView下拉重新整理上拉載入更多效果實現

  在Android開發中,下拉重新整理和上拉載入更多在很多app中都會有用到,下面就是具體的實現的方法。 首先,我們自定義一個RefreshListView來繼承與ListView,下面是程式碼: package com.example.downrefresh; import

Android實現延執行操作的幾種方法

在Android開發中我們可能會有延時執行某個操作的需求,例如我們啟動應用的時候,一開始呈現的是一個引導頁面,過了兩三秒後,會自動跳轉到主介面。這就是一個延時操作。  下面是實現延時執行操作的幾種方法: 1.使用執行緒的休眠實現延時操作    new Thread() {

AndroidListView的用法

(圖片跟內容一點關係也沒有[嘿哈])   l  ListView的作用: (1)    將資料填充到佈局 (2)    處理使用者的選擇點選操作 l  建立ListView需要的3個元素: (1)&nbs

Android執行專案 Error:moudle not specified

Android Studio專案執行本來沒有問題,突然之後就執行不了了: 點選就出現類似這種: 解決辦法: 1、在這裡選擇這個點選: 2、然後在彈出框中選這個: 接下來可能執行還是不行,然後接