欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

解決RecycleView分割線不居中的三種方法

 更新時間:2016年05月27日 11:19:22   作者:pengkv  
這篇文章主要為大家分享了解決RecycleView分割線不居中的三種方法,感興趣的小伙伴們可以參考一下

本文為大家分享了三種RecycleView分割線不居中的解決方法,供大家參考,具體內(nèi)容和如下

方法一:

public class SpacesItemDecoration extends RecyclerView.ItemDecoration {

  private int mSpace;
  private int mSpanCount; // RecyclerView有多少列
  private boolean mHasPadding; // RecyclerView是否有Padding

  public SpacesItemDecoration(int mSpace) {
    this.mSpace = mSpace;
    this.mHasPadding = true;
  }

  public SpacesItemDecoration(int mSpace, boolean hasPadding) {
    this.mSpace = mSpace;
    this.mHasPadding = hasPadding;
  }

  @Override
  public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
    // 初始化列數(shù)
    if (mSpanCount == 0) {
      this.mSpanCount = ((GridLayoutManager) parent.getLayoutManager()).getSpanCount();
    }
    int position = parent.getChildAdapterPosition(view); // item position
    int column = position % mSpanCount; // item column

    if (mHasPadding) {
      outRect.left = mSpace - column * mSpace / mSpanCount; // spacing - column * ((1f / spanCount) * spacing)
      outRect.right = (column + 1) * mSpace / mSpanCount; // (column + 1) * ((1f / spanCount) * spacing)
      if (position < mSpanCount) { // top edge
        outRect.top = mSpace;
      }
      outRect.bottom = mSpace; // item bottom
    } else {
      outRect.left = column * mSpace / mSpanCount; // column * ((1f / spanCount) * spacing)
      outRect.right = mSpace - (column + 1) * mSpace / mSpanCount; // spacing - (column + 1) * ((1f /  spanCount) * spacing)
      if (position >= mSpanCount) {
        outRect.top = mSpace; // item top
      }
    }
  }

  public void setHasPadding(boolean hasPadding) {
    this.mHasPadding = hasPadding;
  }

}

方法二:

public class MutiItemDecoration extends RecyclerView.ItemDecoration {

  public enum Type {
    VERTICAL, HORIZONTAL, ALL
  }

  private Type type;//分割線類型
  private int dividerSize = 10;//分割線尺寸


  public MutiItemDecoration(MutiItemDecoration.Type type, int dividerSize) {
    this.type = type;
    this.dividerSize = dividerSize;
  }


  @Override
  public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) {
    int spanCount = getSpanCount(parent);
    int childCount = parent.getAdapter().getItemCount();

    switch (type) {
      case ALL:
        if (itemPosition % spanCount == 0) {//第一列
          if (isLastRaw(parent, itemPosition, spanCount, childCount)) {
            outRect.set(0, 0, dividerSize / 2, 0);
          } else {
            outRect.set(0, 0, dividerSize / 2, dividerSize);
          }
        } else if (itemPosition % spanCount == spanCount - 1) {//最后一列
          if (isLastRaw(parent, itemPosition, spanCount, childCount)) {
            outRect.set(dividerSize / 2, 0, 0, 0);
          } else {
            outRect.set(dividerSize / 2, 0, 0, dividerSize);
          }
        } else {//中間列
          if (isLastRaw(parent, itemPosition, spanCount, childCount)) {
            outRect.set(dividerSize / 2, 0, dividerSize / 2, 0);
          } else {
            outRect.set(dividerSize / 2, 0, dividerSize / 2, dividerSize);
          }
        }
        break;
      case VERTICAL:
        if (isLastRaw(parent, itemPosition, spanCount, childCount)) {
          outRect.set(0, 0, 0, 0);
        } else {
          outRect.set(0, 0, 0, dividerSize);
        }
        break;
      case HORIZONTAL:
        if (isLastColum(parent, itemPosition, spanCount, childCount)) {
          outRect.set(0, 0, 0, 0);
        } else {
          outRect.set(0, 0, dividerSize, 0);
        }
        break;
    }
  }

  // 是否是最后一列
  private boolean isLastColum(RecyclerView parent, int pos, int spanCount, int childCount) {
    RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
    if (layoutManager instanceof GridLayoutManager) {
      if ((pos + 1) % spanCount == 0)
        return true;
    } else {
      if (pos == childCount - 1)
        return true;
    }
    return false;
  }

  // 是否是最后一行
  private boolean isLastRaw(RecyclerView parent, int pos, int spanCount, int childCount) {
    RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
    if (layoutManager instanceof GridLayoutManager) {
      childCount = childCount - childCount % spanCount;
      if (pos >= childCount)
        return true;
    } else {
      if (pos == childCount - 1)
        return true;
    }
    return false;
  }


  //返回列數(shù)
  private int getSpanCount(RecyclerView parent) {
    RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
    if (layoutManager instanceof GridLayoutManager) {
      return ((GridLayoutManager) layoutManager).getSpanCount();
    }
    return -1;
  }

}

方法三:(目前只支持2列)

public class DividerGridItemDecoration extends RecyclerView.ItemDecoration {

  private static final int[] ATTRS = new int[]{android.R.attr.listDivider};
  private Drawable mDivider;

  public DividerGridItemDecoration(Context context) {
    final TypedArray a = context.obtainStyledAttributes(ATTRS);
    mDivider = ContextCompat.getDrawable(context, R.drawable.shape_divider);
    a.recycle();
  }

  @Override
  public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {

    drawHorizontal(c, parent);
    drawVertical(c, parent);

  }

  private int getSpanCount(RecyclerView parent) {
    // 列數(shù)
    int spanCount = -1;
    RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
    if (layoutManager instanceof GridLayoutManager) {

      spanCount = ((GridLayoutManager) layoutManager).getSpanCount();
    } else if (layoutManager instanceof StaggeredGridLayoutManager) {
      spanCount = ((StaggeredGridLayoutManager) layoutManager)
          .getSpanCount();
    }
    return spanCount;
  }

  public void drawHorizontal(Canvas c, RecyclerView parent) {
    int childCount = parent.getChildCount();
    for (int i = 0; i < childCount; i++) {
      final View child = parent.getChildAt(i);
      final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
          .getLayoutParams();
      final int left = child.getLeft() - params.leftMargin;
      final int right = child.getRight() + params.rightMargin
          + mDivider.getIntrinsicWidth();
      final int top = child.getBottom() + params.bottomMargin;
      final int bottom = top + mDivider.getIntrinsicHeight();
      mDivider.setBounds(left, top, right, bottom);
      mDivider.draw(c);
    }
  }

  public void drawVertical(Canvas c, RecyclerView parent) {
    final int childCount = parent.getChildCount();
    for (int i = 0; i < childCount; i++) {
      final View child = parent.getChildAt(i);


      final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
          .getLayoutParams();

      if (i % 2 == 1) {
        final int top = child.getTop() - params.topMargin;
        final int bottom = child.getBottom() + params.bottomMargin;
        final int left = child.getLeft() - params.rightMargin;
        final int right = left + mDivider.getIntrinsicWidth() / 2;
        mDivider.setBounds(left, top, right, bottom);
        mDivider.draw(c);
      } else {
        final int top = child.getTop() - params.topMargin;
        final int bottom = child.getBottom() + params.bottomMargin;
        final int left = child.getRight() + params.rightMargin;
        final int right = left + mDivider.getIntrinsicWidth() / 2;
        mDivider.setBounds(left, top, right, bottom);
        mDivider.draw(c);
      }


      final int top = child.getTop() - params.topMargin;
      final int bottom = child.getBottom() + params.bottomMargin;
      final int left = child.getRight() + params.rightMargin;
      final int right = left + mDivider.getIntrinsicWidth();

      mDivider.setBounds(left, top, right, bottom);
      mDivider.draw(c);
    }
  }

  private boolean isLastColum(RecyclerView parent, int pos, int spanCount,
                int childCount) {
    RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
    if (layoutManager instanceof GridLayoutManager) {
      if ((pos + 1) % spanCount == 0)// 如果是最后一列,則不需要繪制右邊
      {
        return true;
      }
    } else if (layoutManager instanceof StaggeredGridLayoutManager) {
      int orientation = ((StaggeredGridLayoutManager) layoutManager)
          .getOrientation();
      if (orientation == StaggeredGridLayoutManager.VERTICAL) {
        if ((pos + 1) % spanCount == 0)// 如果是最后一列,則不需要繪制右邊
        {
          return true;
        }
      } else {
        childCount = childCount - childCount % spanCount;
        if (pos >= childCount)// 如果是最后一列,則不需要繪制右邊
          return true;
      }
    }
    return false;
  }

  private boolean isLastRaw(RecyclerView parent, int pos, int spanCount,
               int childCount) {
    RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
    if (layoutManager instanceof GridLayoutManager) {
      childCount = childCount - childCount % spanCount;
      if (pos >= childCount)// 如果是最后一行,則不需要繪制底部
        return true;
    } else if (layoutManager instanceof StaggeredGridLayoutManager) {
      int orientation = ((StaggeredGridLayoutManager) layoutManager)
          .getOrientation();
      // StaggeredGridLayoutManager 且縱向滾動
      if (orientation == StaggeredGridLayoutManager.VERTICAL) {
        childCount = childCount - childCount % spanCount;
        // 如果是最后一行,則不需要繪制底部
        if (pos >= childCount)
          return true;
      } else
      // StaggeredGridLayoutManager 且橫向滾動
      {
        // 如果是最后一行,則不需要繪制底部
        if ((pos + 1) % spanCount == 0) {
          return true;
        }
      }
    }
    return false;
  }

  @Override
  public void getItemOffsets(Rect outRect, int itemPosition,
                RecyclerView parent) {
    int spanCount = getSpanCount(parent);
    int childCount = parent.getAdapter().getItemCount();
    if (isLastRaw(parent, itemPosition, spanCount, childCount))// 如果是最后一行,則不需要繪制底部
    {
      outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);
    } else if (isLastColum(parent, itemPosition, spanCount, childCount))// 如果是最后一列,則不需要繪制右邊
    {
      outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
    } else {
      outRect.set(0, 0, mDivider.getIntrinsicWidth(),
          mDivider.getIntrinsicHeight());
    }
  }
}

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

相關(guān)文章

  • Android多渠道打包時獲取當前渠道的方法

    Android多渠道打包時獲取當前渠道的方法

    這篇文章主要介紹了Android多渠道打包時獲取當前渠道的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2020-01-01
  • Android?Adapter適配器使用示例講解

    Android?Adapter適配器使用示例講解

    這篇文章主要為大家介紹了Android?Adapter適配器使用示例講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • Android巧用ViewPager實現(xiàn)左右循環(huán)滑動圖片

    Android巧用ViewPager實現(xiàn)左右循環(huán)滑動圖片

    這篇文章主要為大家詳細介紹了Android巧用ViewPager實現(xiàn)左右循環(huán)滑動圖片的相關(guān)資料,感興趣的小伙伴們可以參考一下
    2016-05-05
  • Android之使用Android-query框架開發(fā)實戰(zhàn)(二)

    Android之使用Android-query框架開發(fā)實戰(zhàn)(二)

    這篇文章主要介紹了Android之使用Android-query框架開發(fā)實戰(zhàn)(二)的相關(guān)資料,需要的朋友可以參考下
    2015-10-10
  • Android打印機--小票打印格式及模板設(shè)置實例代碼

    Android打印機--小票打印格式及模板設(shè)置實例代碼

    這篇文章主要介紹了Android打印機--小票打印格式及模板設(shè)置實例代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-04-04
  • Android系統(tǒng)模擬位置的使用方法

    Android系統(tǒng)模擬位置的使用方法

    這篇文章主要為大家詳細介紹了Android系統(tǒng)模擬位置的使用方法,具有參考價值,感興趣的小伙伴們可以參考一下
    2016-05-05
  • Android音頻焦點管理實例詳解

    Android音頻焦點管理實例詳解

    音頻是個專業(yè)術(shù)語,音頻一詞已用作一般性描述音頻范圍內(nèi)和聲音有關(guān)的設(shè)備及其作用,人類能夠聽到的所有聲音都稱之為音頻,它可能包括噪音等,下面這篇文章主要給大家介紹了關(guān)于Android音頻焦點管理的相關(guān)資料,需要的朋友可以參考下
    2022-01-01
  • Android使用WebSocket實現(xiàn)多人游戲

    Android使用WebSocket實現(xiàn)多人游戲

    WebSocket 是 HTML5 一種新的協(xié)議。實現(xiàn)了瀏覽器與服務(wù)器全雙工通信,下面通過本文給大家分享Android使用WebSocket實現(xiàn)多人游戲,需要的朋友參考下吧
    2017-11-11
  • Android 安全加密:對稱加密詳解

    Android 安全加密:對稱加密詳解

    本文主要介紹Android 安全加密對稱加密,這里整理了詳細的資料及介紹凱撒密碼和對稱密碼的資料,有興趣的小伙伴可以參考下
    2016-09-09
  • Android 多種dialog的實現(xiàn)方法(推薦)

    Android 多種dialog的實現(xiàn)方法(推薦)

    下面小編就為大家分享一篇Android 多種dialog的實現(xiàn)方法(推薦),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01

最新評論