RecyclerView及與其相關的類

2021-07-11 09:15:27 字數 4241 閱讀 8267

getchildadapterposition(view):獲取view在adapter中的position。

getchildlayoutposition(view):獲取view在layout中的position。大部分情況下,它與getchildadapterposition()是相同的。但是當新布局尚未完成時(比如新增動畫尚未執行完畢時),兩者的值是不同的。如下:

if(view != null)

view = recyclerview.getchildat(1);

log.e(tag,"before adapter.position = "+recyclerview.getchildadapterposition(view)+",layout = "+recyclerview.getchildlayoutposition(view));

recyclerview.getadapter().notifyiteminserted(1);

log.e(tag,"after adapter.position = "+recyclerview.getchildadapterposition(view)+",layout = "+recyclerview.getchildlayoutposition(view));

連續呼叫該方法兩次,輸出的結果如下:

//第一次

before adapter.position = 1,layout = 1

after adapter.position = 2,layout = 1

//第二次

still adapter.position = 2,layout = 2

before adapter.position = 1,layout = 1

after adapter.position = 2,layout = 1

第一次中,after的adapter的pos為2。這是因為我們呼叫了新insert了乙個item,原來的1就被擠到了2,所以adapter.pos就是2。但layout一直沒有變化,這是因為insert時有乙個動畫,在進行第二次輸出時,動畫沒有執行完畢,

所以在layout中該view的pos依舊是1。當第二次呼叫時,still中可以發現該view的layout.pos已經變成2了,因為新的布局已經生成,在該布局中view的pos就是2。

getchildcount():獲取當前可見的item的數量。注:是可見的item的數量,並不是所有的。

跟recyclerview關聯的adapter,基本使用略,記得建乙個public的viewholder即可。

notifyitemrangeinserted():在指定的開始位置處插入了多個item。

notifyitemrangeremoved():從指定的開始位置處移除了多個item。

notifyitemrangechanged():從指定的開始位置處有多個item的內容發生了變化,需要進行更新。它有兩個方法,多出來的object物件是傳遞給觀察者的(這些notify內部都是使用了觀察者模式)。

notifyitemremoved(int):移除指定位置的item。

notifyitemchanged(int):指定位置的item內容發生了變化。

notifyitemchanged(int,object):同上,object也是傳遞到相應的觀察者中。

notifyiteminserted(int):在指定的位置處插入乙個item。

notifyitemmoved(int,int):指定位置的兩個item進行交換。

notifydatasetchanged():與listview的adapter類似。它與上面幾個方法的區別在於,該方法在增,刪,改時不會引起動畫的執行,但上面的會。

允許對recyclerview新增特殊的圖案或者使item發生偏移。有以下三個方法:

ondraw():為recyclerview新增一些額外的修飾,該方法會在item繪製之前進行呼叫。也就是說它繪製的內容可能會被item給覆蓋住——如果繪製在item的空格處就不會被擋住。

ondrawover():基本上與ondraw()類似,只不過在item繪製之後繪製。因此可能會覆蓋住item的內容。

getitemoffsets():獲取每乙個item的在各個方向的需要額外留出的空餘量,各個方向空餘量的值需要設定到第乙個引數rect物件中。比如一共有4列,對於720px的手機來說,每一列的寬度為180。如果每乙個item的右側空餘量為5px,那麼每一列的寬度為175px。

主要思路是:每乙個item偏移一定的位置,在空出來的位置上繪製圖形,這些圖形就是分隔線。如下:

public class divideritemdecor extends recyclerview.itemdecoration 

}@override

public void getitemoffsets(rect outrect, view view, recyclerview parent, recyclerview.state state)

}

上述**中會出現乙個問題:因為getchildcount()返回的是可見item的個數,所以隨著不斷的滑動同乙個item對應的i值會不斷變化。因此,如果分隔線的顏色跟i的取值有關的話,就會分隔線不斷的變化。如在drawrect()之前新增上如下**(主要目的是為了讓分隔線有兩種顏色):
if(i % 2!=0)else
那麼,當螢幕滾動時,同個item下的分隔線的顏色會不斷切換。為解決該問題,應將i轉換成view的adapter.pos。如下:
int position = parent.getchildadapterposition(child);

if(position % 2!=0)else

這也是處理不同位置的item的常用思路:拿到adapter position,再根據這個position進行操作。

乙個與recyclerview配套的使用的list集合。它是乙個自動對內部元素進行排序的list集合。其常用方法與一般的list集合類似,無非是增刪改等,別的方法如下:

recalculatepositionofitemat():重新計算某個位置上item的應該所處的位置。比如某個item被勾選了,它應該出現在最前面等,這個時候就需要重新計算位置。其示例如下:

@override

public todoviewholder oncreateviewholder(final viewgroup parent, int viewtype)

mbounditem.misdone = isdone;

mdata.recalculatepositionofitemat(adapterposition);//通知重新計算位置}};

}

beginbatchedupdates()endbatchedupdates():類似於事務,在批量新增或刪除之前之後呼叫。如下:

msortedlist.beginbatchedupdates();

try finally

使用方法如下(v7demo):

mdata = new sortedlist(item.class, new sortedlistadaptercallback(this) 

int txtcomp = t0.mtext.compareto(t1.mtext);

if (txtcomp != 0)

if (t0.id < t1.id) else if (t0.id > t1.id)

return 0;

}@override

public boolean arecontentsthesame(item olditem,

item newitem)

@override

public boolean areitemsthesame(item item1, item item2)

});

下面以add()為例,分析上面的後兩個函式的作用:

private int add(t item, boolean notify)  else if (index < msize)  else }}

addtodata(index, item);//如果沒有,就直接將item新增到集合中

if (notify)

return index;

}

MQTT介紹及與其他協議的比較

mqtt message queuing telemetry transport,訊息佇列遙測傳輸 一種針對移動終端裝置的基於tcp ip的發布 訂閱協議 可以連線大量的遠端感測器和控制裝置 mqtt的特點是可以保持長連線,具有一定的實時性 要保持長連線,那麼就要不時地傳送心跳包,這就不會省電 特點...

recyclerView動畫解讀

我彷彿在逗我笑,就算繼承了,還是要呼叫setanimator方法,這樣還是會建立viewholder 那麼,自己給view設定動畫是否可以呢?我們知道,recyclerview是通過notifyitem來改變item的狀態的,這就是傳說中的觀察者模式,那麼我們沒有 notifyitemchanged...

RecyclerView 控制項使用

recyclerview的任務僅限於 和定位螢幕上的列表項,對於列表項的內容顯示我們還需要借助adapter子類和viewholder子類。viewholder的作用是容納view檢視。recyclerview工作需要layoutmanager支援。recyclerview檢視建立好後,要立即交給l...