場(chǎng)景
一般關(guān)于RecyclerView列表?xiàng)l目的增刪改加動(dòng)畫(huà)的話 會(huì)考慮用itemAnimators
recyclerView.setItemAnimator(new ScaleInLeftAnimator())身笤;
adapter里會(huì)用到如下的幾個(gè)方法:
- notifyItemInserted(int position)
- notifyItemRemoved(int position)
- notifyItemRangeChanged(int positionStart, int itemCount)
示例代碼
public void add(String text, int position) {
mDataSet.add(position, text);
notifyItemInserted(position);
}
public void remove(int position) {
mDataSet.remove(position);
notifyItemRemoved(position);
}
public void changeData(List<String> datas) {
int len = mDataSet.size();
if (!mDataSet.isEmpty()) {
mDataSet.clear();
}
mDataSet.addAll(datas);
notifyItemRangeChanged(0,datas.size());
}
坑在哪
- 假如在position=1的位置,插入/刪除/一條數(shù)據(jù)稳吮,ui上沒(méi)啥問(wèn)題。但是F昂怼L病粉臊!
以add item舉例,add后酪劫,原來(lái)positiom為1的item現(xiàn)在應(yīng)該為2了,debug發(fā)現(xiàn)并沒(méi)有寺董,position還是1覆糟。 - notifyItemRangeChanged(0,datas.size()); 假如原本列表是50條數(shù)據(jù),你批量替換數(shù)據(jù)為新的10條數(shù)據(jù)遮咖,不要直接這樣用滩字,這個(gè)方法只是item內(nèi)容改變的時(shí)候用,不是完全替代notifyDataSetChanged();
解決方案
public void remove(int position) {
mDataSet.remove(position);
notifyItemRemoved(position);
notifyItemRangeChanged(position,mDataSet.size()-position);
}
public void add(String text, int position) {
mDataSet.add(position, text);
notifyItemInserted(position);
notifyItemRangeChanged(position,mDataSet.size()-position);
}
public void changeData(List<String> datas) {
int len = mDataSet.size();
if (!mDataSet.isEmpty()) {
mDataSet.clear();
}
mDataSet.addAll(datas);
notifyDataSetChanged();
//notifyItemRangeChanged(0,datas.size());//內(nèi)容改變的時(shí)候用
}
最后
- 我沒(méi)看源碼御吞,不是很懂google怎么想的麦箍,請(qǐng)懂的老鐵指點(diǎn)迷津,比看源碼快陶珠,萬(wàn)分感謝挟裂。
- 問(wèn)題: 假如列表切換新的數(shù)據(jù),想有change動(dòng)畫(huà)揍诽,又想用setItemAnimator的動(dòng)畫(huà)方式诀蓉,該怎么用notifyItemRangeChanged() ??栗竖?
- 寫個(gè)帖子問(wèn)題很多系列 哈哈哈