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...