1. 程式人生 > >RecyclerView瀑布流,專案解決item跳動,留白,閃爍

RecyclerView瀑布流,專案解決item跳動,留白,閃爍

最近公司,開發仿快手的短視訊音樂APP,其中首頁自然需要用到瀑布流,下面說下自己碰到的坑:

瀑布流,首先,肯定圖片要設定不同的高度,佈局中圖片自然是用wrap_content,下面說坑:

item到處跳動,甚至左右兩列切換,解決辦法:

manager.setGapStrategy(StaggeredGridLayoutManager.GAP_HANDLING_NONE);

這個自不用說,網上一搜一大把。但是即使這樣,當你載入多頁後,在網上滑到第一頁,會出現空白,或者圖片交錯,這時候,你網上一搜,很多人說:

xRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
    @Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); manager.invalidateSpanAssignments(); } });
這樣一來,好像首頁不留白, 但是,但是我相信很多人下拉載入更多的過程中肯定會發現圖片會閃爍,然後往回滑動的時候出現部分圖片跳來跳去,網上搜的這個方法太不靠譜,我折騰了很久,網上有作者貼出原始碼:http://www.jianshu.com/p/81e088000ba6
,不會出現我的情況,而且人家也沒有用上面的監聽方法。後面我嘗試了很多,比較了很多,解決辦法一句程式碼:下拉載入更多,一定是呼叫
notifyItemInserted(載入更多開始position);

而不是notifyDataSetChange();只要這樣去載入更多,理論上圖片閃爍,和留白問題都解決了。我的圖片載入是Glide。如果有問題可一起討論。

另外仿快手瀑布流,瀑布流左右不留間距,只有中間留間距的辦法,一開始困擾了我好久,如果不是瀑布流,自然可以對每個item判斷是左邊還是右邊,然後分別設定LayoutParams,但是在瀑布流中怎麼知道對應的item是左邊還是右邊呢?關鍵就是怎麼知道對應的item是左邊還是右邊。我說一下我實現的思路,首先肯定需要獲取每個item的高度,新建一個hashMap,用於記錄item是左邊還是右邊,增加兩個屬性,左、右累加高度,通過邏輯去判斷每個item的高度是加在做高度上,還是右高度上,判斷左>右,自然這個item應該在右邊,否則左邊,並且通過前面的hashMap儲存好,下次只要判斷對應positon是否存在,然後拿出來即可!噼裡啪啦說了這麼多,肯定很枯燥,我大概貼一下我的程式碼吧,當然有些寫的不是很好的地方,多多批評!

我發現天貓的瀑布流也有左右跳轉的問題,但我確實在之前版本中把這個解決了。

//計算高度
if (!imageHeightMap.containsKey(position)) {
    paramsHeight = (int) ((rankingData.getLength() / (float) rankingData.getWidth()) * width);
imageHeightMap.put(position, paramsHeight);
} else {
    paramsHeight = imageHeightMap.get(position);
}

//判斷是左邊還是右邊
if (!isLeftMap.containsKey(position)) {
    if (leftHeight < rightHeight) {
        isLeft = true;
} else if (leftHeight == rightHeight) {
        isLeft = !isLeft;
} else {
        isLeft = false;
}

    //高度累加
if (isLeft) {
        leftHeight = leftHeight + paramsHeight + bottomHeight;
} else {
        rightHeight = rightHeight + paramsHeight + bottomHeight;
}
    isLeftMap.put(position, isLeft);
} else {
    isLeft = isLeftMap.get(position);
}

//重新設定寬高
ViewGroup.LayoutParams layoutParams = viewHolder.ivItemBackground.getLayoutParams();
layoutParams.height = paramsHeight;
viewHolder.ivItemBackground.setLayoutParams(layoutParams);
//整個item設定高度和左右邊距
if (isLeft) {
    StaggeredGridLayoutManager.LayoutParams layoutLeftParams = (StaggeredGridLayoutManager.LayoutParams) viewHolder.itemView.getLayoutParams();
layoutLeftParams.leftMargin = DisplayUtil.dip2px(mContext, 0);
layoutLeftParams.rightMargin = DisplayUtil.dip2px(mContext, (float) 1);
viewHolder.itemView.setLayoutParams(layoutLeftParams);
} else {
    StaggeredGridLayoutManager.LayoutParams layoutRightParams = (StaggeredGridLayoutManager.LayoutParams) viewHolder.itemView.getLayoutParams();
layoutRightParams.leftMargin = DisplayUtil.dip2px(mContext, (float) 1);
layoutRightParams.rightMargin = DisplayUtil.dip2px(mContext, 0);
viewHolder.itemView.setLayoutParams(layoutRightParams);
}

相關推薦

RecyclerView瀑布專案解決item跳動閃爍

最近公司,開發仿快手的短視訊音樂APP,其中首頁自然需要用到瀑布流,下面說下自己碰到的坑:瀑布流,首先,肯定圖片要設定不同的高度,佈局中圖片自然是用wrap_content,下面說坑:item到處跳動,甚至左右兩列切換,解決辦法:manager.setGapStrategy(

RecyclerView和StaggeredGridLayoutManager實現瀑布流向下滑動item跳動的問題

由於專案需要最近第一次採用RecyclerView和StaggeredGridLayoutManager實現了瀑布流,原本以為官方的東西不會有什麼問題,但是好事多磨,實現了以後上拉載入更多,都沒有問題,但是下拉回顯上面的item的時候出現跳動,回到最頂部的時候還會有留白。針

Android 解決RecyclerView瀑布效果結合Glide使用時圖片變形的問題

變形 into 想要 pla enter glide加載圖片 pan etc clas 問題描述:使用Glide加載RecyclerView的Item中的圖片,RecyclerView使用了瀑布流展示圖片,但是滾動時圖片會不斷的加載,並且大小位置都會改變,造成顯示錯亂。

Android RecyclerView瀑布Item寬度異常的問題(原始碼分析)

問題描述 通過RecyclerView配合StaggeredGridLayoutManager可以很方便的實現瀑布流效果,一般情況下會把作為Item的子View寬度設定為MATCH_PARENT,那麼子View將根據列數(假定是垂直排列)平均分配Recycle

RecyclerView瀑布一邊空太多一邊擠滿了

最近專案開發的時候發現用RecyclerView寫的瀑布流,不是按照正常的計算高度排列的,兩列瀑布,一列空了很多,另外一列擠滿了,找了好久都沒找到原因,知道是高度計算問題,可不知道是哪裡的原因。後來發現全部用ImageLoader載入的網路圖片就沒這個問題,而

採用maven的聚合專案拆分、整合boot cloud時錯誤的整合思路如何解決

idea下,如何進行springboot的maven聚合依賴。 首先,把我的專案結構圖大致說明一下: 專案檔案結構大致圖: 對應的pom資訊如下,從父級逐級顯示,以下只是備註自己的關鍵程式碼 jt-parent <modules> <modul

RecyclerView 瀑布使用總結

目錄   遇到的問題 解決辦法 遇到的問題 item亂跳,頂部留白,滑動卡頓 item設定間距 解決辦法 問題1 關鍵在於知道圖片的原始寬高,然後根據圖片的原始寬高比動態的設定item的高度。 圖片的原始寬高可以由後臺返回,也可以

RecyclerView瀑布設定左、右、上、下的距離一樣

RecyclerVeiw本身自帶有距離設定的類,如下:只需要我們繼承一下即可 public class SpaceBaseItemDecoration extends RecyclerView.ItemDecoration { private int spac

recyclerview 的複用或者是item裡的圖片問題還是圖片隨著數量不斷變大以及裡button複用

不管是recyclerview和listview、girdview,都不知道用了多少次了,用著用著還是會出現問題,這裡只是記錄一下,加深印象,寫的有些粗糙,勿怪!出現複用的問題,listview和gridview需要自己定義viewholder,而recyclerview裡面已經定義viewho

Android RecyclerView瀑布佈局新增Footer實現上拉載入

這篇文章應該是晚到了好幾個月,之前想寫,但是中途遇到了一些棘手的問題,無奈沒有去寫。寫這篇文章的最初來源是一個朋友問我在Android中如何實現瀑布流佈局?,當時我的回答是使用RecyclerView,後來他又問我那怎麼實現上拉載入並新增Footer呢?我想都沒

Recyclerview瀑布效果

新增依賴,如上文 public class RecycleAdapter extends RecyclerView.Adapter<RecycleAdapter.MyHolder> { private Context context; privat

Android RecyclerView瀑布展示(OkHttp協議)

一言不合就上圖 OkHttp和recyclerView都是第三方提供的,so先注入依賴 //okhttp3網路請求協議 compile 'com.squareup.okhttp3:okhttp:3.9.0' //recyclerview控制元

Vue專案解決element元件環形進度條超過100%時不渲染問題。

問題描述:使用element元件的環形進度條時,給出的屬性只有一個引數, 要求只能填寫1-100的數,當我們的數值超過100時,想要把環形渲染滿,但問題出來了,700以上的數值時,圖層就不渲染了,如下圖所示:              

RecyclerView瀑布載入圖片實現

先寫好RecyclerView的介面卡. public class MyRecyclerAdapter extends RecyclerView.Adapter<MyRecyclerAdapter.MyViewHolder> { priv

MVP模式 + RecyclerView瀑布 + 上拉載入、下拉重新整理

首先匯入一些用到的依賴:(不要忘記新增網路許可權) //  包括OKhttp網路請求、springview重新整理載入、butterknife相當於findviewbyid、glide載入圖片 //  recyclerview-flexibledivider分割線 com

如何給recyclerView瀑布設定均等間距

recyclerVIew 預設是不帶間距的,但是我們可以通過SpacesItemDecoration方法給其設定間距,但是這樣問題來了這樣設定的間距如果有兩列的話 中間的間距是你設定的間距的2倍,至於為什麼會這樣,是SpacesItemDecoration方法中設定間距的方式是給itemview的四周加上

Recyclerview 瀑布效果

1.Activity public class SecondActivity extends Activity {     private RecyclerView recyclerView;     private ArrayList<String> list

Android Studio [RecyclerView/瀑布顯示]

interface pos scaletype super oid appcompat adapt 分享 near PuRecyclerViewActivity.java package com.xdw.a122.recyclerview; import and

使用maven構建專案專案上有紅叉提示錯誤但是錯誤找不到

專案上有紅叉提示錯誤,但是整個專案沒有任何檔案有錯,這是怎麼回事啊錯誤現象如圖 -----------------------------------------------------------------------------------------------

公共鑰匙盒 程式碼複雜但是容易理解。先以後再優化

#include <iostream> #include<stdio.h> #include<queue> #include<string.h> #include<stdlib.h> #include