给你一个新思路
Closed this issue · 2 comments
WanDa1993 commented
private class SurplusListener extends RecyclerView.OnScrollListener {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
mSurplusHeight = mSurplusLayout.getHeight();
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
/**
* 这块主要是比对当前的可见的第一个元素 之后的元素是否和其是同一组,如果不是
* 即下一部分必为Title,所以即执行粘性头操作.
*/
//TODO 这一块 实现的方式感觉还是太Low
int pos = mLayoutManager.findFirstVisibleItemPosition();
int spanSize = mLayoutManager.getSpanSizeLookup().getSpanSize(pos);
//spanSize == 1代表的是当前Item只占1个格子,而每行有三个格子
if (spanSize == 1) {
String tag = contents.get(mCurrentPosition).getTag();
String tag1 = contents.get(mCurrentPosition + 1).getTag();
String tag2 = contents.get(mCurrentPosition + 2).getTag();
String tag3 = contents.get(mCurrentPosition + 3).getTag();
Log.d("比较值", "tag : " + tag + "----tag1 : " + tag1 + "----tag2 : " + tag2 + "----tag3 : " + tag3);
//因为1行有3个元素,这时候需要考虑不同的情况,然后确定位置.
if (!TextUtils.equals(tag, tag1)) {
changeHeader(mCurrentPosition + 1);
} else if (!TextUtils.equals(tag, tag2)) {
changeHeader(mCurrentPosition + 2);
} else if (!TextUtils.equals(tag, tag3)) {
changeHeader(mCurrentPosition + 3);
}
}
if (mCurrentPosition != mLayoutManager.findFirstVisibleItemPosition()) {
mCurrentPosition = mLayoutManager.findFirstVisibleItemPosition();
mSurplusLayout.setY(0);
//更新假头的显示内容
int tag = Integer.parseInt(contents.get(mCurrentPosition).getTag());
updateSuspensionBar(tag);
}
}
/**
* 改变粘性头,使其滑动
* 实现粘性头的核心
*/
private void changeHeader(int position) {
View view = mLayoutManager.findViewByPosition(position);
if (view != null) {
if (view.getTop() <= mSurplusHeight) {
mSurplusLayout.setY(-(mSurplusHeight - view.getTop()));
} else {
mSurplusLayout.setY(0);
}
}
}
}
WanDa1993 commented
其实道理和你在ItemDerition的逻辑是一样的.
就是怎么去找 下一个粘性头的位置,如果是GridLayoutManager,就得逐行找.
我是按你方式,然后实现的.最后当做感谢吧.~
wustor commented
好的,谢谢,不过这个项目还是采用itemDecoration来实现,因为滑动的时候监听右侧的列表滑动的时候,已经给RecyclerView设置了滑动监听,如果改变头部的时候再监听的话,里面代码就比较多了,不过也是一种思路