1. 程式人生 > >Android開發——ListView區域性重新整理的實現

Android開發——ListView區域性重新整理的實現

0. 前言

區域性重新整理,即只需要在資料發生變化時才去重新整理ListView中對應的Item,資料未發生變化時不會去重新整理ListView中對應的Item。對於getView()非常耗時的情況下將體現出極大的效能優化。區域性重新整理的功能早已經被整合在了RecycleView中,而且RecycleView還引入了增加和刪除的動態效果等等,在效能上和定製上都有很大的改善。本篇著重介紹ListView中區域性重新整理的實現。

1.  結合AdapterhasStableIds()以及getItemId()

區域性重新整理的實質是找到那些資料發生改變Item,並且重新呼叫它的一次getView()方法。

那麼如何才能讓Adapter知道哪些Item的資料發生了變化呢?Stack OverFlow上有人提出了以下方案:

//If hasStableIds() returns false then each time you call notifyDataSetChanged() your Adapter will look at the returned
//value of getItemId and will eventually call getView(int position, View convertView, ViewGroup parent) only for those 
//items which id has changed.Using this technique you can update only one Item in the ListView.

設定AdapterhasStableIds()返回false,代表子元素持有不穩定的ID。如果hasStableIds()返回了false,每次呼叫notifyDataSetChanged()方法adapter就會判斷getItemId()方法的返回值,如果該返回值發生了變化,即某個Item發生了變化,那麼就只調用發生變化的那些ItemgetView()方法,從而達到區域性重新整理的效果。

舉例如下:如果你有一個List的元素,Bean檔案如下:

class Data{
     String myUrl;
     String myContent;
}

你需要在getItemId()方法中這樣寫:

@Override
public long getItemId(int position){
    Data data = mList.get(position);
    return (data. myUrl + data. myContent).hashcode();
}

因為我們平時在寫getItemId()方法的時候直接返回了position這裡我們讓getItemId()的返回值不依賴於位置,而是依賴於這個位置上資料的實時資訊,如果這個位置上的資料發生了變化(即List.get(position)處的資料發生了改變),再呼叫notifyDataSetChanged()時,Adapter會檢測到該位置的ID發生了變化,就會重新呼叫該位置ItemgetView()方法,從而達到區域性重新整理的效果。

2.  直接找到指定位置的holder

private void updateItem(int position) {
    View view = mListview.getChildAt(position);
    MyAdapter.ViewHolder holder = (MyAdapter.ViewHolder)view.getTag();
    holder.textView.setText("This is new");
    //記得更新list資料來源中position位置的資料,避免滑動後區域性重新整理失效
}

以上方式是比較常規的,即根據position位置找到對應子Viewholder,直接根據業務需求修改holder中的資料即可。當然,記得更新list資料來源中position位置的資料,否則來回滑動後區域性重新整理會失效。



相關推薦

Android開發——ListView區域性重新整理實現

0. 前言區域性重新整理,即只需要在資料發生變化時才去重新整理ListView中對應的Item,資料未發生變化時不會去重新整理ListView中對應的Item。對於getView()非常耗時的情況下將體

Android開發---ListView實現區域性重新整理及刪除

1.行佈局,及簡單的點選控制元件重新整理Activity程式碼public class MainActivity extends Activityimplements IControl { private ArrayList<MyListEntity> l

Android開發-listview實現多條目展示

如果我們的listview做的很好了 那麼多條目對你來說就很簡單了,因為多條目是基於listview的 它們只是在介面卡中有所不同 現在我們來看一下介面卡 public class MyAdapter extends BaseAdapter { private ArrayList&

Android ListView區域性重新整理資料

對於ListView、Gridview重新整理列表我們並不陌生,只需要在資料來源改變之後,呼叫BaseAdapter的notifyDataSetChanged方法,就可以重新整理列表了。但是,如果我們只改變了某一行item的資料,只需要重新整理單條item,也去

我的Android進階之旅------&gt;Android二級ListView列表的實現

cat -i gravity 寫真 技術分享 家政服務 個性 韓國 服務 實現例如以下圖所看到的的二級列表效果 首先是在布局文件裏,布局兩個ListView,代碼例如以下: <LinearLayout xmlns:android="htt

Android開發ListView左滑刪除

import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; import android.content.Co

android開發 textview內容過多實現上下滑動

用textview顯示一大段文字時,不能再一頁裡面顯示完全,需要上下滑動的方法來實現完全顯示。 方案如下: 1.xml檔案中: <TextView     …     android:scrol

android 開發 -- NavigationView和DrawerLayout實現 側滑欄(Material Design)

隨著 Google I/O 2015,新的 Android Design Support Library給開發者帶來了一些重要的 Material Design 元件,並且向下相容到 Android 2.1, NavigationView 就是其中之一,可用於方便地建立導航抽

Android開發之TabLayout真正實現底部導航欄(可實現點選文字顏色圖片切換)

前言:關於這個TabLayout實現底部導航,在我的上篇《Android開發之TabLayout實現底部導航欄》部落格中有提到,但是後面在仔細的接觸專案中,發現了裡面有很多沒有解決的事情,比如不能實現點選文字顏色和圖片的切換,不能做到禁止左右滑動,所以趁著今天有時間的情況下

AndroidListView錯位佈局實現(無聊向)

由於某些原因,需要個錯位的頁面,在網上找不到好的例子,試著動手寫了寫。 不考慮配色的完成圖如下: 首先考慮的是,listview每一行左右都有可能縮排。 先假設一行的佈局就是ImageView,TextView,ImageView,程式碼如下: 1 <Line

探討Android開發ListView的Item裡包含EditText控制元件遇到的一些問題

相信很多程式猿用到ListView都會遇到很多的問題,這裡我們就討論下ListView每個條目包含有EditText時遇到的問題。 主要有: 1,點選編輯框時,焦點看不到,即失去焦點,或不彈出軟鍵盤。 2,這個編輯框輸入內容時,由於ListView的重用機

Android開發技巧——使用Dialog實現仿QQ的ActionSheet選單

最近看到有人用Dialog來實現QQ的仿ActionSheet的自定義選單,對於自己沒實現過的一些控制元件,看著也想實現一下。於是動手了一下,發現也不難,和大家分享一下。 在這裡我也是用Dialog來實現,程式碼不多,這裡說一下實現的過程。 選單的佈

Android 開發之下拉重新整理+ViewPager的banner滾動

暫時不逼逼,先來兩張鮮果圖: 在這個專案裡,核心部分就是怎麼在下拉重新整理的類裡面,加入ViewPage,這麼先說設計介面需要新建的xml。 第一步:在資原始檔resource 的layout 新建activity_main.xml; <?xml version

Android開發之使用VideoView實現視訊的橫屏播放、去除邊框

做專案需要播放一個引導視訊,本以為很簡單,結果動手時發現總有瑕疵,幸好有度娘,現把收穫總結如下: 一、實現視訊播放: 註明我這裡要播放的是Android專案中的資原始檔,而不是訪問SD卡播放視訊。 1

android開發中通過aidl實現遠端方法呼叫

在安卓開發過程中我們可能見過這樣的問題,就是在一個應用中呼叫另一個應用中的服務,並呼叫該服務中的方法。 我們可能對呼叫服務並不陌生,可是要執行服務中的方法,卻不能直接呼叫。因為兩個服務和呼叫它的程式屬

Android開發ListView保持固定資料行Item

偶遇公司開發中的一個小需求,掃碼獲得的資料最多傳遞至伺服器只能是二條; 也就是說,不管使用者掃碼多少次,頁面只顯示二條最新的資料; 以下為思路: 裝載資料肯定用到Listv

Android開發-----定位功能的實現----騰訊地圖定位

Android---手機定位功能       由於自己在做專案的時候應用到了手機定位功能,自己也是琢磨了好長時間,一開始用的百度地圖,研究了幾天總是出現一些不同的Bug,而且很難修復,然後又想用手機自

Android開發——程式鎖的實現(可用於開發釣魚登入介面)

1. 程式鎖原理1.1 實現效果:在使用者開啟一個應用時,若此應用是我們業務內的邏輯攔截目標,那就在開啟應用之後,彈出一個輸入密碼的介面,輸入密碼正確則進入目標應用。若不輸入直接按返回鍵,則直接返回桌面

Android開發listview最後一行顯示下劃線

在我們開發Android的過程中,很多時候訊息顯示列表需要用到listview,但有的時候我們會發現預設的listview最後一行沒有下劃線,給使用者體驗效果總感覺的怪怪。那麼我們如何設定listvie

Android開發之滑動ScrollView實現ToolBar半透明效果

前言:Toolbar前幾章都有介紹,現在的越來越多的使用toolbar,便開始在toolbar上做效果,常見的是隨著你的滑動,toolbar呈現半透明的效果,有的是隨著你的滾動而滾動,今天我們實現的效果就是toolbar呈現半透明的效果! -----------------