RecyclerView<第五篇>:刷新機(jī)制

RecyclerView的刷新分為以下兩種情況:

  • 刷新的數(shù)據(jù)量比較大或者刷新Item的位置不確定
  • .刷新指定Item

1.如果大量的數(shù)據(jù)被修改或者被修改數(shù)據(jù)的位置不確定桶良,則使用

adapter.notifyDataSetChanged();

這個方法很消耗性能苞也,不到萬不得已不要使用勺疼,請盡量使用下面的刷新方法揽祥。

2.刷新某一項(常用)

//刷新某Item中的所有組件
adapter.notifyItemChanged(position);
//刷新某Item中的部分組件
adapter.notifyItemChanged(position, payloads);
//插入Item
adapter.notifyItemInserted(position);       
//刪除Item
adapter.notifyItemRemoved(position);  
//移動Item
adapter.notifyItemMoved(position, position + 1);
圖片.png

需求1:點(diǎn)擊按鈕1堡牡,使圖片和文字改變煤伟。

switch (view.getId()){
    case R.id.image:
        Toast.makeText(MainActivity.this, "點(diǎn)擊了圖片", Toast.LENGTH_SHORT).show();
        break;
    case R.id.button_1:
        Toast.makeText(MainActivity.this, "點(diǎn)擊了按鈕1", Toast.LENGTH_SHORT).show();
        PhotoBean photoBean = list.get(position);
        photoBean.setName("修改恐似!");
        photoBean.setUrl("http://pic29.nipic.com/20130511/9252150_174018365301_2.jpg");
        adapter.notifyItemChanged(position);
        break;
     case R.id.button_2:
        Toast.makeText(MainActivity.this, "點(diǎn)擊了按鈕2", Toast.LENGTH_SHORT).show();
         break;
 }
10.gif

需求2:點(diǎn)擊按鈕2,使按鈕2高亮涣旨。

首先添加一個clickButton狀態(tài)

public class PhotoBean {

    private String name;

    private String url;

    private byte clickButton;//0:點(diǎn)擊了圖片歪架,1:點(diǎn)擊了按鈕1,2:點(diǎn)擊了按鈕2

    public PhotoBean(){}

    public PhotoBean(String url, String name, byte clickButton){
        this.url = url;
        this.name = name;
        this.clickButton = clickButton;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public byte getClickButton() {
        return clickButton;
    }

    public void setClickButton(byte clickButton) {
        this.clickButton = clickButton;
    }
}

修改onBindViewHolder方法,將按鈕變黃

    @Override
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
        PhotoBean dataListBean = mData.get(position);

        if(dataListBean != null){

            Glide.with(mContext).load(dataListBean.getUrl()).into(((ViewHolder)holder).imgView);
            ((ViewHolder)holder).tvName.setText(dataListBean.getName());

            if(dataListBean.getClickButton() == 2){
                ((ViewHolder)holder).button_2.setBackgroundColor(Color.YELLOW);
            }
        }

        ((ViewHolder)holder).imgView.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mOnItemClickLitener != null) {
                    if(mData != null && mData.size() > 0){
                        mOnItemClickLitener.onItemClick(((ViewHolder)holder).imgView, position);
                    }
                }
            }
        });

        ((ViewHolder)holder).button_1.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mOnItemClickLitener != null) {
                    if(mData != null && mData.size() > 0){
                        mOnItemClickLitener.onItemClick(((ViewHolder)holder).button_1, position);
                    }
                }
            }
        });

        ((ViewHolder)holder).button_2.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mOnItemClickLitener != null) {
                    if(mData != null && mData.size() > 0){
                        mOnItemClickLitener.onItemClick(((ViewHolder)holder).button_2, position);
                    }
                }
            }
        });
    }

效果如下:


11.gif

這樣貌似已經(jīng)實(shí)現(xiàn)了功能霹陡,但是存在兩個嚴(yán)重的弊端:
1.我只要將按鈕2改變顏色就行了和蚪,為什么圖片還會刷新?
2.我每次點(diǎn)擊按鈕2烹棉,圖片攒霹、文字、按鈕都要重新排版一次浆洗,嚴(yán)重消耗性能催束,也許現(xiàn)在手機(jī)性能比較好,很多人不在乎伏社,但是我在乎抠刺。

解決方案:使用payloads實(shí)現(xiàn)刷新Item中的部分控件。

修改按鈕2點(diǎn)擊事件實(shí)現(xiàn)

case R.id.button_2:
     Toast.makeText(MainActivity.this, "點(diǎn)擊了按鈕2", Toast.LENGTH_SHORT).show();
     PhotoBean photoBean2 = new PhotoBean();
     photoBean2.setClickButton((byte) 2);
     adapter.notifyItemChanged(position, photoBean2);
      break;

添加回調(diào)方法

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position, @NonNull List<Object> payloads) {
        if(payloads != null && !payloads.isEmpty()){
            if(payloads.get(0) instanceof PhotoBean){
                PhotoBean photoBean = (PhotoBean) payloads.get(0);

                if(photoBean.getClickButton() == 2){
                    ((ViewHolder)holder).button_2.setBackgroundColor(Color.YELLOW);
                }
            }

        }else{
            onBindViewHolder(holder, position);
        }
    }

展示效果

12.gif

需求3:實(shí)現(xiàn)添加刪除和移動功能

case R.id.button_3:
     Toast.makeText(MainActivity.this, "添加Item", Toast.LENGTH_SHORT).show();
     list.add(position, new PhotoBean(list.get(position).getUrl(), list.get(position).getName(), list.get(position).getClickButton()));
     adapter.notifyItemInserted(position);
     break;
case R.id.button_4:
     Toast.makeText(MainActivity.this, "刪除Item", Toast.LENGTH_SHORT).show();
     list.remove(position);
     adapter.notifyItemRemoved(position);
     break;
case R.id.button_5:
     Toast.makeText(MainActivity.this, "移動Item", Toast.LENGTH_SHORT).show();
     Collections.swap(list,position,position+1);// 元素互換
     adapter.notifyItemMoved(position, position + 1);
     break;

添加效果:


13.gif

刪除效果:


14.gif

移動效果:


15.gif

另外洛口,以上講解的都是刷新一個Item矫付, 下面四個方法是更新多個Item

public final void notifyItemRangeChanged(int positionStart, int itemCount);
public final void notifyItemRangeChanged(int positionStart, int itemCount, @Nullable Object payload)第焰;
public final void notifyItemRangeInserted(int positionStart, int itemCount)买优;
public final void notifyItemRangeRemoved(int positionStart, int itemCount) ;

其實(shí),更新一個Item的方法杀赢,底層都會調(diào)用以上四個方法的其中一個烘跺,只是此時itemCount=1。

需要注意的是:

    mRecyclerView.setHasFixedSize(false);

您可能還需要知道setHasFixedSize的的使用脂崔。

  • 當(dāng)setHasFixedSize為true時滤淳,Item高度變化時,不會重新計算高度砌左;
  • 當(dāng)setHasFixedSize為false時脖咐,Item高度變化時,會重新計算高度汇歹;

setHasFixedSize默認(rèn)是false屁擅。
當(dāng)執(zhí)行

onItemRangeChanged()
onItemRangeInserted()
onItemRangeRemoved()
onItemRangeMoved()

時,可以設(shè)置setHasFixedSize為true产弹,讓Item的高度不會重新計算派歌,這樣可以保證性能。

如果調(diào)用了notifyDataSetChanged痰哨,Item的大小總是會被重新計算胶果。

大家可以參考一下文章:

RecyclerView性能優(yōu)化:setHasFixedSize

[本章完...]

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市斤斧,隨后出現(xiàn)的幾起案子早抠,更是在濱河造成了極大的恐慌,老刑警劉巖撬讽,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贝或,死亡現(xiàn)場離奇詭異,居然都是意外死亡锐秦,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進(jìn)店門盗忱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來酱床,“玉大人,你說我怎么就攤上這事趟佃∩纫ィ” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵闲昭,是天一觀的道長罐寨。 經(jīng)常有香客問我,道長序矩,這世上最難降的妖魔是什么鸯绿? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上瓶蝴,老公的妹妹穿的比我還像新娘毒返。我一直安慰自己,他們只是感情好舷手,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布拧簸。 她就那樣靜靜地躺著,像睡著了一般男窟。 火紅的嫁衣襯著肌膚如雪盆赤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天歉眷,我揣著相機(jī)與錄音牺六,去河邊找鬼。 笑死姥芥,一個胖子當(dāng)著我的面吹牛兔乞,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播凉唐,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼庸追,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了台囱?” 一聲冷哼從身側(cè)響起淡溯,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎簿训,沒想到半個月后咱娶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡强品,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年膘侮,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片的榛。...
    茶點(diǎn)故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡琼了,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出夫晌,到底是詐尸還是另有隱情雕薪,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布晓淀,位于F島的核電站所袁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏凶掰。R本人自食惡果不足惜燥爷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一蜈亩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧局劲,春花似錦勺拣、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至苹丸,卻和暖如春垂谢,著一層夾襖步出監(jiān)牢的瞬間峰弹,已是汗流浹背仓洼。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工公壤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人商模。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓奠旺,卻偏偏與公主長得像,于是被迫代替她去往敵國和親施流。 傳聞我的和親對象是個殘疾皇子响疚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 這篇文章分三個部分,簡單跟大家講一下 RecyclerView 的常用方法與奇葩用法瞪醋;工作原理與ListView比...
    LucasAdam閱讀 4,391評論 0 27
  • 1.今天上午在婆婆家看著安裝雨搭忿晕,前幾天下大雨,婆婆住的平房從窗戶里進(jìn)了好多雨水银受,婆婆嚇壞了践盼,也忙壞了。與做雨搭的...
    感恩生命中有你閱讀 307評論 1 4
  • 最近電視劇《我的前半生》悄然火爆,大致講述的是一個資深全職太太在35歲的時候遭遇“小三門”被丈夫拋棄顶霞,然后又重新崛...
    曉達(dá)親子情商療愈閱讀 713評論 0 4
  • 人生啊 本來是一場夢 做美夢 醒來兩手空空 愛情啊 但愿能有結(jié)果 擦干淚 明天還是要過.
    Secreto_閱讀 94評論 0 1
  • 七律 汾陽市杏花村 文/黑茶山 十里杏花酒飄香谅河,釀造汾酒水似湯。 酒槽漂香思舊事确丢,土城牌角載文章。 游人盛贊百年酒...
    黑茶山_c940閱讀 199評論 0 1