Android 關(guān)于RecyclerView瀑布流顯示圖片時(shí)Item切換眯分、閃爍等問題優(yōu)化

問題分析

最近使用RecyclerView的瀑布流樣式加載、顯示圖片柒桑,由于剛開始沒有進(jìn)行優(yōu)化弊决,會有Item切換、閃爍魁淳、跳頁等等等問題飘诗,體驗(yàn)甚是差呀,這就需要我們?nèi)?yōu)化改進(jìn)了界逛。

先考慮下昆稿,為什么會有這樣的問題呢?因?yàn)閳D片在加載的時(shí)候由于尺寸未知(特別是高度)息拜,所以Item需要重新計(jì)算自己的尺寸溉潭,這樣又會導(dǎo)致重繪净响,由于瀑布流一次會加載多張圖片,所以就產(chǎn)生了喳瓣,Item切換馋贤、閃爍、跳頁等問題畏陕。說到底就是在加載圖片前配乓,先確定Item的尺寸,避免Item重新計(jì)算自己的尺寸蹭秋。Item的尺寸如何確定呢扰付?那就要先得到要加載圖片的尺寸,然后設(shè)置給Item中的ImageView仁讨。

解決方案

網(wǎng)上有的說法是對StaggeredGridLayoutManager進(jìn)行如下設(shè)置:

layoutManager.setGapStrategy(StaggeredGridLayoutManager.GAP_HANDLING_NONE);

經(jīng)測試羽莺,確實(shí)解決了Item左右切換的問題,但是滑動時(shí)候每一列還是會跳動洞豁,同時(shí)頂部和底部有空白盐固。繼續(xù)優(yōu)化吧。

我們的圖片data是網(wǎng)絡(luò)請求獲得的丈挟,得到data后先進(jìn)行一次處理:

@Override
public void onSuccess(List<GirlItemData> data) {
     DataService.startService(mActivity, data, mSubtype);
 }

通過啟動一個(gè)IntentService刁卜,根據(jù)圖片的url,獲得對應(yīng)的Bitmap曙咽,進(jìn)而得到圖片的尺寸信息:

public class DataService extends IntentService {
    public DataService() {
        super("");
    }

    public static void startService(Context context, List<GirlItemData> datas, String subtype) {
        Intent intent = new Intent(context, DataService.class);
        intent.putParcelableArrayListExtra("data", (ArrayList<? extends Parcelable>) datas);
        intent.putExtra("subtype", subtype);
        context.startService(intent);
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        if (intent == null) {
            return;
        }

        List<GirlItemData> datas = intent.getParcelableArrayListExtra("data");
        String subtype = intent.getStringExtra("subtype");
        handleGirlItemData(datas, subtype);
    }

    private void handleGirlItemData(List<GirlItemData> datas, String subtype) {
        if (datas.size() == 0) {
            EventBus.getDefault().post("finish");
            return;
        }
        for (GirlItemData data : datas) {
            Bitmap bitmap = ImageLoader.load(this, data.getUrl());
            if (bitmap != null) {
                data.setWidth(bitmap.getWidth());
                data.setHeight(bitmap.getHeight());
            }

            data.setSubtype(subtype);
        }
        EventBus.getDefault().post(datas);
    }
}

最后將尺寸信息封裝到data中蛔趴,并通過EventBus傳回。

為什么要用IntentService呢例朱?因?yàn)樗谧泳€程執(zhí)行孝情,執(zhí)行完后自動結(jié)束,同時(shí)我們獲得Bitmap是通過Glide洒嗤,只能在子線程進(jìn)行箫荡,畢竟這個(gè)過程是個(gè)耗時(shí)操作,所以子線程加持的IntentService還是省心省事的渔隶。

得到EventBus返回的data羔挡,就是刷新Adapter了,看一下Adapter中的操作:

@Override
protected void convert(RecyclerView.ViewHolder viewHolder, GirlItemData girlItemData) {
        ViewHolder holder = (ViewHolder) viewHolder;
        ScaleImageView imageView = holder.getView(R.id.girl_item_iv);
        imageView.setInitSize(girlItemData.getWidth(), girlItemData.getHeight());
        ImageLoader.load(NiceReadApplication.getContext(), girlItemData.getUrl(), imageView);
    }

其實(shí)ScaleImageView重寫了ImageView的onMeasure方法间唉,我們將圖片的寬高設(shè)置給ScaleImageView绞灼,然后再加載圖片。

效果

最后我們來對比下前后的效果:

優(yōu)化前
優(yōu)化后

源碼鏈接...

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末呈野,一起剝皮案震驚了整個(gè)濱河市镀赌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌际跪,老刑警劉巖商佛,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異姆打,居然都是意外死亡良姆,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進(jìn)店門幔戏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來玛追,“玉大人,你說我怎么就攤上這事闲延∪剩” “怎么了?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵垒玲,是天一觀的道長陆馁。 經(jīng)常有香客問我,道長合愈,這世上最難降的妖魔是什么叮贩? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮佛析,結(jié)果婚禮上益老,老公的妹妹穿的比我還像新娘。我一直安慰自己寸莫,他們只是感情好捺萌,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著膘茎,像睡著了一般桃纯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上辽狈,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天慈参,我揣著相機(jī)與錄音,去河邊找鬼刮萌。 笑死驮配,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的着茸。 我是一名探鬼主播壮锻,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼涮阔!你這毒婦竟也來了猜绣?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤敬特,失蹤者是張志新(化名)和其女友劉穎掰邢,沒想到半個(gè)月后牺陶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡辣之,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年掰伸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片怀估。...
    茶點(diǎn)故事閱讀 40,872評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡狮鸭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出多搀,到底是詐尸還是另有隱情歧蕉,我是刑警寧澤,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布康铭,位于F島的核電站惯退,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏麻削。R本人自食惡果不足惜蒸痹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望呛哟。 院中可真熱鬧叠荠,春花似錦、人聲如沸扫责。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鳖孤。三九已至者娱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間苏揣,已是汗流浹背黄鳍。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留平匈,地道東北人框沟。 一個(gè)月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像增炭,于是被迫代替她去往敵國和親忍燥。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評論 2 361

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,331評論 25 707
  • 線程和進(jìn)程的區(qū)別是啥 詳見 http://www.reibang.com/p/04c3706521b5 線程切換如...
    MrWang915閱讀 1,163評論 0 2
  • 文/小哲 請借我一雙明亮的眸子 讓我有機(jī)會在這詩的海洋里鐘靈毓秀 從南到北 從西到東 在文字與言語之間尋出你的門徑...
    小哲小詩閱讀 369評論 0 3
  • 未來隙姿,我該如何譜寫梅垄??输玷?
    841130閱讀 224評論 0 0
  • 寫下這個(gè)題目队丝,被自己的粗暴略微嚇了一跳靡馁。可是炭玫,這真的是我占領(lǐng)你的方式啊奈嘿。 人間四月,芳菲盡顯的時(shí)候吞加,我看見你身披霞...
    梅園遺珠閱讀 431評論 0 0