wustor/GangedRecyclerview

给你一个新思路

Closed this issue · 2 comments

    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);
                }
            }
        }
    }

其实道理和你在ItemDerition的逻辑是一样的.

就是怎么去找 下一个粘性头的位置,如果是GridLayoutManager,就得逐行找.

我是按你方式,然后实现的.最后当做感谢吧.~

好的,谢谢,不过这个项目还是采用itemDecoration来实现,因为滑动的时候监听右侧的列表滑动的时候,已经给RecyclerView设置了滑动监听,如果改变头部的时候再监听的话,里面代码就比较多了,不过也是一种思路