最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

item高度不同時Recyclerview獲取滑動距離的方法

 更新時間:2018年11月09日 13:43:03   作者:MingMing很忙  
這篇文章主要介紹了item高度不同時Recyclerview獲取滑動距離的方法,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

前言

最近遇到需求,要計算RecyclerView滑動距離,用提供的computeVerticalScrollOffset()方法得到的值不是很準確。是基于item的平均高度算得,如果列表中item高度一致可以用此方法。問題來了,我的應用場景是各item高度不一,這時就只能另找方法了。

方法一

網上找的方法,用一個變量去統(tǒng)計,每次滑動的時候累加y軸偏移量。item插入\移動\刪除的時候,需要手動去更新totalDy,不然就會一直錯下去。

private int totalDy = 0;
mRecycler.addOnScrollListener(new RecyclerView.OnScrollListener() {
  @Override
  public void onScrolled(RecyclerView recyclerview, int dx, int dy) {
    totalDy -= dy;
  }
}

方法二:

方法一比較麻煩,而且坑較多。所以考慮重寫LinearLayoutManager的computeVerticalScrollOffset()方法,既然原生方法是按平均高度計算的,那重寫該計算邏輯,就能達到我們想要的效果。

1.統(tǒng)計列表已展示過的item的高度,在每次布局完成的時候,用一個map記錄positon位置item對應的view的高度。

private Map<Integer, Integer> heightMap = new HashMap<>();
int count = getChildCount();
for (int i = 0; i < count; i++) {
  View view = getChildAt(i);
  heightMap.put(i, view.getHeight());
}

2.重寫computeVerticalScrollOffset(),找到當前屏幕第一個可見item的position,通過heightMap循環(huán)累加0到positon的item高度,再加上第一個可見item不可見部分高度。最終得到整個列表的滑動偏移。

@Override
public int computeVerticalScrollOffset(RecyclerView.State state) {
  if (getChildCount() == 0) {
    return 0;
  }
  int firstVisiablePosition = findFirstVisibleItemPosition();
  View firstVisiableView = findViewByPosition(firstVisiablePosition);
  int offsetY = -(int) (firstVisiableView.getY());
  for (int i = 0; i < firstVisiablePosition; i++) {
    offsetY += heightMap.get(i) == null ? 0 : heightMap.get(i);
  }
  return offsetY;
}

3.最終代碼

public class OffsetLinearLayoutManager extends LinearLayoutManager {

  public OffsetLinearLayoutManager(Context context) {
    super(context);
  }

  private Map<Integer, Integer> heightMap = new HashMap<>();

  @Override
  public void onLayoutCompleted(RecyclerView.State state) {
    super.onLayoutCompleted(state);
    int count = getChildCount();
    for (int i = 0; i < count ; i++) {
      View view = getChildAt(i);
      heightMap.put(i, view.getHeight());
    }
  }

  @Override
  public int computeVerticalScrollOffset(RecyclerView.State state) {
    if (getChildCount() == 0) {
      return 0;
    }
    try {
      int firstVisiablePosition = findFirstVisibleItemPosition();
      View firstVisiableView = findViewByPosition(firstVisiablePosition);
      int offsetY = -(int) (firstVisiableView.getY());
      for (int i = 0; i < firstVisiablePosition; i++) {
        offsetY += heightMap.get(i) == null ? 0 : heightMap.get(i);
      }
      return offsetY;
    } catch (Exception e) {
      return 0;
    }
  }
}

mRecycler.setLayoutManager(new OffsetLinearLayoutManager(mContext));

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • ViewPager判斷是向左劃還是右劃的實例

    ViewPager判斷是向左劃還是右劃的實例

    下面小編就為大家?guī)硪黄猇iewPager判斷是向左劃還是右劃的實例。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • Android Flutter表格組件Table的使用詳解

    Android Flutter表格組件Table的使用詳解

    Table組件不同于其它Flex布局,它是直接繼承的RenderObjectWidget的。本篇文章主要介紹如何在頁面中使用表格做一個記錄,感興趣的可以嘗試一下
    2022-06-06
  • Android OpenGLES2.0繪制三角形(二)

    Android OpenGLES2.0繪制三角形(二)

    這篇文章主要為大家詳細介紹了Android OpenGLES2.0繪制三角形的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • Android?Xml轉換為View過程詳解

    Android?Xml轉換為View過程詳解

    這篇文章主要為大家介紹了Android?Xml轉換為View實現過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • Android分屏多窗口的實踐代碼

    Android分屏多窗口的實踐代碼

    這篇文章主要介紹了Android分屏多窗口的實踐代碼,需要的朋友可以參考下
    2017-01-01
  • Android Canvas自定義實現時鐘效果

    Android Canvas自定義實現時鐘效果

    這篇文章主要為大家詳細介紹了Android Canvas自定義實現時鐘效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • Android開發(fā)之BottomSheetDialog組件的使用

    Android開發(fā)之BottomSheetDialog組件的使用

    BottomSheetDialog是底部操作控件,可在屏幕底部創(chuàng)建一個支持滑動關閉視圖。本文將通過示例詳細講解它的使用,感興趣的小伙伴可以了解一下
    2023-01-01
  • Android仿簡書長按文章生成圖片效果

    Android仿簡書長按文章生成圖片效果

    使用簡書APP的同學都知道,簡書有這樣一個功能;文章頁長按內容時底部會出現一個 生成圖片分享 的按鈕,點擊之后就可以將當前的文章生成一張長圖片;這張圖片可以保存到本地或分享給好友,同時還可為圖片設置成為白和黑兩種風格,很有藝術范
    2017-03-03
  • ViewPager 與 Fragment相結合實現微信界面實例代碼

    ViewPager 與 Fragment相結合實現微信界面實例代碼

    這篇文章主要介紹了ViewPager 與 Fragment相結合實現微信界面實例代碼的相關資料,需要的朋友可以參考下
    2016-07-07
  • Android開發(fā)DataBinding基礎使用

    Android開發(fā)DataBinding基礎使用

    這篇文章主要為大家介紹了Android開發(fā)DataBinding基礎使用實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06

最新評論

万源市| 黔西| 岑巩县| 大田县| 措美县| 桐乡市| 义马市| 阜新| 梨树县| 嘉禾县| 乡城县| 聊城市| 吉林省| 瓦房店市| 闽清县| 门源| 洱源县| 铜梁县| 许昌县| 湖南省| 巨鹿县| 紫阳县| 元谋县| 海城市| 曲松县| 安阳市| 龙泉市| 同德县| 瑞安市| 翁源县| 华安县| 江达县| 明光市| 宁强县| 临西县| 平舆县| 星座| 额尔古纳市| 涟水县| 双柏县| 油尖旺区|