天天看點

notifyItemChanged(int position) 引起的傳回時RecyclerView頁面不自然的跳動

問題

如圖顯示

notifyItemChanged(int position) 引起的傳回時RecyclerView頁面不自然的跳動

産生從詳情傳回至清單頁時,下方的Item有個向上的動畫。我在傳回的同時有發一個eventBus,其中我調用了

notifyItemChanged(int position)

方法,我首先想到的是添加

mRecyclerView.getItemAnimator().setChangeDuration(0);

此方法(因為以前發生過頁面閃的動畫),但是很不幸的是加了此代碼之後還是會有此問題。

然後我再利用排除法把

notifyItemChanged(int position)

這行代碼注釋一下,看看是不是由此影響的重新整理情況。注釋之後果然傳回的時候已經不會刷了,但是我必須按照要求詳情改變了資料之後需要重新整理清單的資料,是以這行代碼是不可以删除的。于是我經過大量的傳回測試之後我發現了,這個向上的動畫隻有在清單當中有圖檔才回出現,是以這時候想到的原因應該就是因為重新繪制了一遍圖檔的寬高,是以才會有下面的item發生位置的變化,這個時候我想到的解決辦法是能不能回調重新整理的時候不重新整理圖檔,隻重新整理我需要的資料。是以debug了一下,發現了

notifyItemChanged(int position)

走的是

notifyItemRangeChanged(int positionStart, int itemCount, Object payload)

同時在Adapter當中都是走

onBindViewHolder(VH holder, int position, List<Object> payloads)

,這其中都有

payload

這個東東,是以我先google了一下,在這篇文章當中找到了解釋,原來隻需要在你自己的adapter重寫一下

onBindViewHolder(VH holder, int position, List<Object> payloads)

這個方法,當然要不影響你原來的recyclerView的adapter應該做好判斷,例如:

```
 @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        holder.updatePosition(position);
        convert(holder, getItem(position));
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position, List<Object> payloads) {
        if (payloads.isEmpty()) {
            onBindViewHolder(holder, position);
        } else {
            holder.updatePosition(position);
            convert(holder, getItem(position), payloads);
        }
    }
```
           

根據payloads是否又傳值來判斷是走那個方法。

還有一個很關鍵的是需要注意如果你是用了一個

adapterWarpper

重新包裝了一下

adpater

(例如給

adapter

增加頭部,增加底部),同樣要記得在

adapterWapper

當中重寫走

onBindViewHolder(VH holder, int position, List<Object> payloads)

此方法。

```
 @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        wrapped.onBindViewHolder(holder, position);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position, List payloads) {
        wrapped.onBindViewHolder(holder, position, payloads);
    }
``` 
           

繼續閱讀