RecyclerView、LIstView的局部刷新

最近項(xiàng)目中用到了點(diǎn)擊顯示下拉列表龄恋,列表呀當(dāng)然要用list顯示啊疙驾,當(dāng)然也可以不用,有人說(shuō)郭毕,可以簡(jiǎn)單粗暴的用死布局直接剛它碎。好了,那個(gè)說(shuō)直接剛的人你可以閉嘴了显押,數(shù)據(jù)是后臺(tái)返的扳肛,是變化的,這樣只能用列表來(lái)動(dòng)態(tài)的顯示數(shù)據(jù)乘碑,再加上后來(lái)還加入了一個(gè)點(diǎn)擊顏色變化的需求挖息,遂才引出這篇文章,List列表的局部更新兽肤。

一套腹、RecyclerView局部刷新

????RecyclerView的局部刷新是有區(qū)分的,有數(shù)據(jù)的刷新和 item 結(jié)構(gòu)的刷新资铡,局部的 item 插入电禀、刪除、移動(dòng)刷新方法都是結(jié)構(gòu)的刷新笤休。而 notifyItemChanged尖飞、notifyItemRangeChanged 方法屬于數(shù)據(jù)的刷新。

1. 數(shù)據(jù)刷新

數(shù)據(jù)刷新還分全部刷新和局部刷新店雅,

全部刷新:**notifyDataSetChanged()**,**notifyItemChanged(int)**;
局部刷新:**notifyItemRangeChanged(int,int)**(從指定位置開始刷新指定個(gè)item)政基,
**notifyItemChanged(int, Object)**。

這里notifyItemChanged底洗,第二個(gè)參數(shù)控制刷新全部還是局部腋么,如:
@Override
    public void onBindViewHolder(MyViewHolder holder, final int position, List<Object> payloads) {
        super.onBindViewHolder(holder, position, payloads);
        if (payloads.isEmpty()){  
        //全部刷新
        }else {
        //局部刷新
        }
    }

這里主要講刷新指定item。

2. item 結(jié)構(gòu)刷新

結(jié)構(gòu)刷新分:插入亥揖、移動(dòng)珊擂、移除一個(gè)并自動(dòng)刷新

插入:notifyItemInserted(int)
用法:

    /**
     * 添加并更新數(shù)據(jù),同時(shí)具有動(dòng)畫效果
     */
    public void addDataAt(int position, DataBean data) {
        mDatas.add(position, data);
        notifyItemInserted(position);//更新數(shù)據(jù)集费变,注意如果用adapter.notifyDataSetChanged()將沒有動(dòng)畫效果
    }

移動(dòng):notifyItemMoved(int)

移除:notifyItemRemoved(int)
用法:

    /**
     * 移除并更新數(shù)據(jù)摧扇,同時(shí)具有動(dòng)畫效果
     */
    public void removeDataAt(int position) {
        mDatas.remove(position);
        notifyItemRemoved(position);
    }

二、ListView局部刷新

非notifyDataSetChanged方式挚歧。

方法一:更新對(duì)應(yīng)view的內(nèi)容

item點(diǎn)擊事件{
 datas.set(position, "改變當(dāng)前位置數(shù)據(jù)" + position);
      updateSingle(position);//要更新的位置
}
  /**
     *
     * @param position 要更新的位置
     */
    private void updateSingle(int position) {
        /**第一個(gè)可見的位置**/
        int firstVisiblePosition = listView.getFirstVisiblePosition();
        /**最后一個(gè)可見的位置**/
        int lastVisiblePosition = listView.getLastVisiblePosition();

        /**在看見范圍內(nèi)才更新扛稽,不可見的滑動(dòng)后自動(dòng)會(huì)調(diào)用getView方法更新**/
        if (position >= firstVisiblePosition && position <= lastVisiblePosition) {
            /**獲取指定位置view對(duì)象**/
            View view = listView.getChildAt(position - firstVisiblePosition);
            TextView textView = (TextView) view.findViewById(R.id.textView);
            textView.setText(datas.get(position));
        }
    }

方法二:通過(guò)ViewHolder去設(shè)置值

    /**
     * 找出對(duì)應(yīng)的ViewHolder,通過(guò)ViewHolder去設(shè)置值
     *
     * @param position 要更新的位置
     */
    private void updateOne(int position) {
        /**第一個(gè)可見的位置**/
        int firstVisiblePosition = listView.getFirstVisiblePosition();
        /**最后一個(gè)可見的位置**/
        int lastVisiblePosition = listView.getLastVisiblePosition();

        /**在看見范圍內(nèi)才更新滑负,不可見的滑動(dòng)后自動(dòng)會(huì)調(diào)用getView方法更新**/
        if (position >= firstVisiblePosition && position <= lastVisiblePosition) {
            /**獲取指定位置view對(duì)象**/
            View view = listView.getChildAt(position - firstVisiblePosition);
            /**通過(guò)ViewHolder找出緩存的對(duì)應(yīng)控件**/
            TextView textView = CommonViewHolder.get(view, R.id.textView);
            textView.setText(datas.get(position));

        }
    }

方法三:調(diào)用一次getView()方法

這種方法是調(diào)用適配器對(duì)應(yīng)的getView方法在张,用它里面的代碼對(duì)界面進(jìn)行刷新盘寡。這也是google在IO大會(huì)上推薦的做法

item點(diǎn)擊事件{
 datas.set(position, "改變當(dāng)前位置數(shù)據(jù)" + position);
      updateItem(position);//要更新的位置
}
 /**
     * 調(diào)用一次getView()方法夷磕;Google推薦的做法
     *
     * @param position 要更新的位置
     */
    private void updateItem(int position) {
        /**第一個(gè)可見的位置**/
        int firstVisiblePosition = listView.getFirstVisiblePosition();
        /**最后一個(gè)可見的位置**/
        int lastVisiblePosition = listView.getLastVisiblePosition();

        /**在看見范圍內(nèi)才更新笙纤,不可見的滑動(dòng)后自動(dòng)會(huì)調(diào)用getView方法更新**/
        if (position >= firstVisiblePosition && position <= lastVisiblePosition) {
            /**獲取指定位置view對(duì)象**/
            View view = listView.getChildAt(position - firstVisiblePosition);
            commonAdapter.getView(position, view, listView);
        }

    }

最后宵蛀,參考鏈接:
DylanAndroid的csdn博客

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市瘟斜,隨后出現(xiàn)的幾起案子缸夹,更是在濱河造成了極大的恐慌,老刑警劉巖螺句,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件虽惭,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡蛇尚,警方通過(guò)查閱死者的電腦和手機(jī)芽唇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)佣蓉,“玉大人披摄,你說(shuō)我怎么就攤上這事∮缕荆” “怎么了?”我有些...
    開封第一講書人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵义辕,是天一觀的道長(zhǎng)虾标。 經(jīng)常有香客問(wèn)我,道長(zhǎng)灌砖,這世上最難降的妖魔是什么璧函? 我笑而不...
    開封第一講書人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮基显,結(jié)果婚禮上蘸吓,老公的妹妹穿的比我還像新娘。我一直安慰自己撩幽,他們只是感情好库继,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著窜醉,像睡著了一般宪萄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上榨惰,一...
    開封第一講書人閱讀 51,578評(píng)論 1 305
  • 那天拜英,我揣著相機(jī)與錄音,去河邊找鬼琅催。 笑死居凶,一個(gè)胖子當(dāng)著我的面吹牛虫给,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播侠碧,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼狰右,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了舆床?” 一聲冷哼從身側(cè)響起棋蚌,我...
    開封第一講書人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎挨队,沒想到半個(gè)月后谷暮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡盛垦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年湿弦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片腾夯。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡颊埃,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蝶俱,到底是詐尸還是另有隱情班利,我是刑警寧澤,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布榨呆,位于F島的核電站罗标,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏积蜻。R本人自食惡果不足惜闯割,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望竿拆。 院中可真熱鬧宙拉,春花似錦、人聲如沸丙笋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)不见。三九已至澳化,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間稳吮,已是汗流浹背缎谷。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人列林。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓瑞你,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親希痴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子者甲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,144評(píng)論 25 707
  • 這篇文章分三個(gè)部分,簡(jiǎn)單跟大家講一下 RecyclerView 的常用方法與奇葩用法砌创;工作原理與ListView比...
    LucasAdam閱讀 4,391評(píng)論 0 27
  • Android ListView與RecyclerView局部刷新 一虏缸、ListView 之前寫過(guò)一篇關(guān)于List...
    蠟筆小劉閱讀 8,881評(píng)論 17 70
  • 時(shí)間的消磨刽辙,人心的荒涼,不免讓人驚顫甲献! 不能太聰明宰缤,也不能太善良,聰明了容易心傷晃洒,善良了容易心疼慨灭!在愛情面前,不愿...
    暖心ma閱讀 608評(píng)論 0 0
  • (微信公眾號(hào):大涵小允) 說(shuō)來(lái)慚愧球及,三毛這個(gè)名字在學(xué)生時(shí)期早已如雷貫耳氧骤,可是不知什么原因,卻一直未曾拜讀過(guò)她的大作...
    李在在閱讀 221評(píng)論 0 1