RecyclerView局部刷新那點事

1.局部刷新的引入 
提到RecyclerView,咱們首先想到的是ListView,對於ListView的局部刷新,咱們以前已經有解決方案,[android:ListView的局部刷新]當時的解決方案是:記錄點擊的Item的position,而後在更新過程當中,不斷的判斷,該position是否是介於可見的Item之間,若是是,則更新,否者,不更新。 android


2.RecyclerView的局部更新  網絡

按照以前的思路,首先要尋找RecyclerView中可見的item的位置範圍,該方法並不在RecyclerView中,而是LinearLayoutManager中,如:優化

int fristPos = layoutManager.findFirstVisibleItemPosi
int lastPos = layoutManager.findLastVisibleItemPosition();

if (position >= fristPos && position <= lastPos) {
  View view = recyclerView.getChildAt(position);
  …
}

而後查找到對應的View,進行更新(遞歸查找) url

    /**
     * 在ViewGroup中根據id進行查找
     * @param vg
     * @param id 如:R.id.tv_name
     * @return
     */
    private View findViewInViewGroupById(ViewGroup vg, int id) {
        for (int i = 0; i < vg.getChildCount(); i++) {
            View v = vg.getChildAt(i);
            if (v.getId() == id) {
                return v;
            } else {
                if (v instanceof ViewGroup) {
                    return findViewInViewGroupById((ViewGroup) v, id);
                }
            }
        }
        return null;
    }    

 

3.新的思路:notifyItemChanged
RecyclerView不像ListView,只有一個更新notifyDataSetChanged,它不只保留了ListView的更新特色,還針對「增長,刪除,更新」操做專門進行更新,能夠只更新一個item,也能夠更新一部分item,因此,用起來效率更高。所以,RecyclerView的局部刷新,就能夠經過修改數據源的方式,調用notifyItemChanged(position)便可。


4.優化
雖然只更新單個item,不會形成閃爍,可是,若是單個item都很複雜,好比,item中須要從網絡上加載圖片等等。爲了不屢次刷新照成的閃爍,咱們能夠在加載的時候,爲ImageView設置一個Tag,好比imageView.setTag(image_url),下一次再加載以前,首先獲取Tag,好比imageUrl = imageView.getTag(),若是此時的地址和以前的地址同樣,咱們就不須要加載了,若是不同,再加載。spa

相關文章
相關標籤/搜索