1. 程式人生 > >關於RecyclerView實現瀑布流,上下滑動時item之間互換位置的問題

關於RecyclerView實現瀑布流,上下滑動時item之間互換位置的問題

  最近專案需求,需要RecyclerView實現瀑布流。在用 StaggeredGridLayoutManager 完成瀑布流的過程中發現一個問題:它並不像pullToRefresh 那樣是穩定的list,而是item之間頻繁交換位置,有時候甚至會出現第一列和第二列完全互換的情況。

  我去搜索相關的問題,並沒有人非常深入的去寫這個控制元件,都是一些基礎的用法。好吧,那隻能自食其力,看原始碼嘍。。。

 原始碼中 StaggeredGridLayoutManager 的解釋中有這樣一段話:

Staggered grids are likely to have gaps at the edges of the layout. To avoid these gaps,StaggeredGridLayoutManager can offset spans independently or move items between spans. You can control this behavior via {@link #setGapStrategy(int)}.

大概意思就是說 Staggered grid可能會有一定間距的佈局邊緣,為了避免這個問題StaggeredGridLayoutManager提供瞭解決這個問題的方法。即通過setGapStrategy(int)進行設定。

 /**
     * Does not do anything to hide gaps.
     */
    public static final int GAP_HANDLING_NONE = 0;


    @Deprecated
    public static final int GAP_HANDLING_LAZY = 1;


    /**
     * When scroll state is changed to {@link RecyclerView#SCROLL_STATE_IDLE}, StaggeredGrid will
     * check if there are gaps in the because of full span items. If it finds, it will re-layout
     * and move items to correct positions with animations.
     * <p>
     * For example, if LayoutManager ends up with the following layout due to adapter changes:
     * <pre>
     * AAA
     * _BC
     * DDD
     * </pre>
     * <p>
     * It will animate to the following state:
     * <pre>
     * AAA
     * BC_
     * DDD
     * </pre>
     */
    public static final int GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS = 2;

  大概意思是:GAP_HANDLING_NONE不為隱藏佈局邊緣差距做任何處理。

 GAP_HANDLING_LAZY 已經過期的變數。

GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS  通過item之間互換位置重新調整佈局。

當我設定了layoutManager.setGapStrategy(StaggeredGridLayoutManager.GAP_HANDLING_NONE);之後,發現item之間互換位置的情況解決了,但是卻出現了從下往上滑動的時候,第一行的圖片距離頂端有一定的空白區域。

問題出現只能繼續解決,等我看了3遍原始碼,確實毫無頭緒的時候就大膽試了一下,可能能解決這個問題的辦法, 就在recycleView.addOnScrollListener的 onScrollStateChanged()方法中呼叫了staggeredGridLayoutManagerlayoutManager.invalidateSpanAssignments()。這樣雖然完全符合了需求,item之間不會調換位置,從下往上滑動的時候,第一行的圖片距離頂端無空白區域。但是又認真的看到原始碼中對此方法的註釋,總是會覺得有點不妥當。

 /**
     * For consistency, StaggeredGridLayoutManager keeps a mapping between spans and items.
     * <p>
     * If you need to cancel current assignments, you can call this method which will clear all
     * assignments and request a new layout.
     */
    public void invalidateSpanAssignments() {
        mLazySpanLookup.clear();
        requestLayout();
    } 

解決方案:

recycleView.addOnScrollListener的onScrollStateChanged()的方法中呼叫staggeredGridLayoutManagerlayoutManager.invalidateSpanAssignments()。

有更好思路的小夥伴請指導

相關推薦

關於RecyclerView實現瀑布上下滑動item之間互換位置的問題

  最近專案需求,需要RecyclerView實現瀑布流。在用 StaggeredGridLayoutManager 完成瀑布流的過程中發現一個問題:它並不像pullToRefresh 那樣是穩定的list,而是item之間頻繁交換位置,有時候甚至會出現第一列和第二列完全互

[置頂] RecyclerView實現瀑布圖片自適應高度

話不多說,先上效果圖 對於RecyclerView,相信大家都不陌生了,這個集listView,GridView,瀑布流效果與一身強大控制元件,漸漸地滲透在每個App.... 還是回到正題,如何讓RecyclerView裡的圖片自適應高度? 我們知道,要讓RecyclerView有瀑布流效果,R

RecyclerView實現瀑布圖片自適應高度

話不多說,先上效果圖 對於RecyclerView,相信大家都不陌生了,這個集listView,GridView,瀑布流效果與一身強大控制元件,漸漸地滲透在每個App.... 還是回到正題,如何讓RecyclerView裡的圖片自適應高度? 我們知道,要讓Recycler

RecyclerView 實現瀑布及點選事件含點選回撥的介面

RecyclerView 實現瀑布流及點選事件 public class FruitAdapter extends RecyclerView.Adapter<FruitAdapter.ViewHolder> { private List

Android RecyclerView 實現瀑布交錯效果並使最後一行子View高度佔滿RecyclerView

而在實現完瀑布流後,覺得滑動到底部時,最後一行的高度,沒有佔滿外部View,感覺不太好。(真正的瀑布流應該是條目數近乎無窮,可以一直載入更多) 既然是瀑布流,那麼就選用StaggeredGridLayoutManager。 mRecyclerView.s

Android中Recyclerview使用13----實現瀑布遇到的各種問題(item移動載入更多圖片閃爍以及定製各種型別Header和Footer)

功能:圖片瀑布流 問題1:如何保持已顯示過的imageview的尺寸 解決方法:定義一個HashMap<Integer, Float> indexMap = new HashMap<Integer, Float>();用來儲存已顯示過的Ima

RecyclerView實現瀑布

效果圖: Main佈局只是一個RecyclerView <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.

Android中利用RecyclerView實現瀑布效果

RecyclerView相比於傳統的ListView,功能更加強大,使用也比較方便,因此Android官方更加推薦使用RecycleView,未來也會有更多的程式逐漸從ListView轉向RecycleView。為此,首先先來了解下RecycleView的用法。當然,最先看

recyclerview實現瀑布佈局

先看效果,這裡我用的背景圖片, 首先匯入依賴 compile 'com.android.support:recyclerview-v7:26.1.0' 下面就是程式碼,首先是佈局 activity_main <RelativeLayout xmlns:a

Android中RecyclerView實現瀑布圖片顯示

效果圖: 具體程式碼如下:(註釋很詳細,基本每句都要註釋) MainActivity.java package com.zhiyuan3g.recyclerviewwaterfall; import android.content.Intent; import an

RecyclerView實現瀑布的效果

效果圖如下 原始碼如下: MainActivity頁面 public class MainActivity extends AppCompatActivity { private RecyclerView recyclerView; private

RecycleView瀑布上下滑動和左右拖拽

話不多說,先上圖:demo中使用到的圖片框架是compile 'com.github.bumptech.glide:glide:3.7.0'Activity佈局:<?xml version="1.0" encoding="utf-8"?> <Relative

Fresco和 RecyclerView 實現瀑布

RecyclerView 實現瀑布流非常的簡單,只需要設定佈局管理為 StaggeredGridLayoutManager。然後還需要設定ItemDecorator 1:大概的步驟如下.具體的步驟在下面的下面. 0:匯入RecyclerView,Fresco 1:佈

RecyclerView 實現瀑布效果

上次用RecyclerView實現了ListView的效果,這次用RecyclerView實現一個瀑布流的效果~ 先上效果圖: 是不是感覺不錯啊~ 其實很簡單~ 只要換一個佈局管理器就行了 mRecyclerView.setLayoutManager(new Sta

Fresco,Retrofit 和 RecyclerView 實現瀑布

圖片是通過Retrofit進行網路請求得到的地址 RecyclerView的使用分為四步 0:匯入RecyclerView和例如Fresco,Retrofit,然後在程式碼裡面新增RecyclerView 1:然後是設定每個項的佈局和實體類, 2:建立RecyclerV

實現HorizontalScrollView中的標題滑動始終處於中間位置

@Override public void onPageSelected(int position) { setCurrentTab(position); } 實現滑動標題時始終居中的函式

TCP通過滑動窗口和擁塞窗口實現能抵禦ddos攻擊嗎

沒有 arc 算法實現 https 占滿 %20 ddos攻擊 ddos www   tcp可以通過滑動窗口和擁塞算法實現流量控制,限制上行和下行的流量,但是卻不能抵禦ddos攻擊。   限流只是限制訪問流量的大小,是無法區分正常流量和異常攻擊流量的。   限流可以控制本軟

5.使用RecyclerView優雅的實現瀑布效果

/** * 作者:Pich * 原文連結:http://me.woblog.cn/ * QQ群:129961195 * 微信公眾號:woblog * Github:https://github.com/lifengsofts */ 概述 從前我們想實現一個瀑布流效果是

Android學習之RecyclerView學習(實現瀑布式佈局)

RecyclerView,大家可以通過匯入support-v7對其進行使用。  如果使用AndroidStudio開發, 需要在build.gradle中新增: compile 'com.android.support:appcompat-v7:24.2.1' com

RecyclerView的簡單使用以及實現瀑布效果

RecyclerView 簡介 RecyclerView是support.v7包中的控制元件,可以認為是ListView和GridView的增強版,RecyclerView提供了一個耦合度更低的方式來複用ViewHolder,可以更輕鬆的實現瀑布流的效果,為增加和刪除條目提