Skip to content

Commit

Permalink
feat: 吸顶优化
Browse files Browse the repository at this point in the history
  • Loading branch information
石工 committed Sep 17, 2020
1 parent f50db72 commit 8f4196e
Showing 1 changed file with 32 additions and 18 deletions.
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package me.wcy.express.widget.radapter;

import android.graphics.Canvas;
import android.graphics.Rect;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
Expand All @@ -14,6 +13,7 @@ public class StickyDecoration extends RecyclerView.ItemDecoration {
private StickyAdapter mStickyAdapter;
private View mStickyItemView;
private int mStickyItemPosition = -1;
private int mStickyItemTop;

public StickyDecoration(StickyAdapter stickyAdapter) {
mStickyAdapter = stickyAdapter;
Expand All @@ -28,28 +28,26 @@ public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state)
}

// 吸顶位置底部位置
int stickyEndAt = mStickyItemView.getTop() + mStickyItemView.getHeight();
// TODO 需要完善
// int stickyEndAt = Math.max(mStickyItemTop + mStickyItemView.getHeight(), 0);
int stickyEndAt = mStickyItemView.getHeight();
// 找到吸顶位置底部的第一个 itemView
View itemView = parent.findChildViewUnder(0, stickyEndAt);

int stickyItemTop = 0;
// 如果吸顶位置底部的第一个 itemView 是吸顶的,则要设置当前吸顶 view 的偏移量
if (isStickyView(parent, itemView)) {
stickyItemTop = itemView.getTop() - mStickyItemView.getHeight();
mStickyItemTop = itemView.getTop() - mStickyItemView.getHeight();
} else {
mStickyItemTop = 0;
}

// 绘制
c.save();
c.translate(0, stickyItemTop);
c.translate(0, mStickyItemTop);
mStickyItemView.draw(c);
c.restore();
}

@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
super.getItemOffsets(outRect, view, parent, state);
}

/**
* 初始化吸顶的 view
* 1. 找到当前吸顶 view 的位置
Expand Down Expand Up @@ -77,10 +75,9 @@ private void checkStickyView(RecyclerView parent) {
return;
}

mStickyItemPosition = stickyItemPosition;
int viewType = mStickyAdapter.getItemViewType(mStickyItemPosition);
int viewType = mStickyAdapter.getItemViewType(stickyItemPosition);
RecyclerView.ViewHolder viewHolder = mStickyAdapter.createViewHolder(parent, viewType);
mStickyAdapter.bindViewHolder(viewHolder, mStickyItemPosition);
mStickyAdapter.bindViewHolder(viewHolder, stickyItemPosition);
mStickyItemView = viewHolder.itemView;

ViewGroup.LayoutParams layoutParams = mStickyItemView.getLayoutParams();
Expand All @@ -107,6 +104,21 @@ private void checkStickyView(RecyclerView parent) {
mStickyItemView.measure(widthSpec, heightSpec);

mStickyItemView.layout(0, 0, mStickyItemView.getMeasuredWidth(), mStickyItemView.getMeasuredHeight());

mStickyItemTop = getDefaultStickyItemTop(mStickyItemPosition, stickyItemPosition, mStickyItemView);
mStickyItemPosition = stickyItemPosition;
}

/**
* 吸顶位置改变,获取默认吸顶偏移量
*/
private int getDefaultStickyItemTop(int oldPosition, int newPosition, View stickView) {
// 向下滚动
if (newPosition < oldPosition) {
return -stickView.getHeight();
} else {
return 0;
}
}

/**
Expand All @@ -116,11 +128,9 @@ private int findStickyItemPosition(int endPosition) {
if (endPosition >= mStickyAdapter.getItemCount()) {
return -1;
}
for (int i = endPosition; i >= 0; i--) {
int viewType = mStickyAdapter.getItemViewType(i);
boolean isSticky = mStickyAdapter.isStickyViewType(viewType);
if (isSticky) {
return i;
for (int p = endPosition; p >= 0; p--) {
if (isStickyPosition(p)) {
return p;
}
}
return -1;
Expand All @@ -134,6 +144,10 @@ private boolean isStickyView(RecyclerView parent, View itemView) {
if (position == RecyclerView.NO_POSITION) {
return false;
}
return isStickyPosition(position);
}

private boolean isStickyPosition(int position) {
int viewType = mStickyAdapter.getItemViewType(position);
return mStickyAdapter.isStickyViewType(viewType);
}
Expand Down

0 comments on commit 8f4196e

Please sign in to comment.