美文网首页
Android实现title吸顶

Android实现title吸顶

作者: RookieRun | 来源:发表于2019-12-04 15:46 被阅读0次

目前实现title吸顶主要是2中思路:
1.ListView
2.RecyclerView
下面逐一介绍。
1.ListView

ListView的方案主要是用于就项目改造,因为新项目早就用Rv了
项目现状:ListView的item中都有title,近期改版中需要将title打造成吸顶的效果,
由于项目已久,界面中逻辑较多,而且又是UI改版,就没有重新写
思路:
RelativeLayout中嵌套ListView和一个TextView,TextView的高度与item中的title高度一致
然后监听ListView的滑动并在合适的时机修改TextView的Y值,以达到滑动的视觉效果

ListView:部分代码

private void updateHoverTitleView() {
        if (timeTitleTv == null) {
            return;
        }
        if (dayPickerView == null || dayPickerView.getChildCount() <= 1) {
            timeTitleTv.setVisibility(View.GONE);
            return;
        }
        View c = dayPickerView.getChildAt(0);

        if (c == null) {
            timeTitleTv.setVisibility(View.GONE);
            return;
        }

        //更新title
        View monthViewInLv = c.findViewById(R.id.tv_month);
        if (monthViewInLv instanceof TextView) {
            String s = ((TextView) monthViewInLv).getText().toString();
            timeTitleTv.setText(s);
        }
        View secondChildView = dayPickerView.getChildAt(1);
        if (secondChildView != null) {
            if (secondChildView.getTop() <= timeTitleTvHeight) {
                timeTitleTv.setY(-(timeTitleTvHeight - secondChildView.getTop()));
            } else {
                timeTitleTv.setY(0);
            }

        }
    }

2.RecyclerView

Rv主要就是自定义ItemDecoration
关键方法是onDrawOver&getItemOffsets

RecyclerView:部分代码

 @Override
    public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
        super.onDrawOver(c, parent, state);

        final int itemCount = state.getItemCount();
        final int childCount = parent.getChildCount();
        final int top = parent.getTop() + parent.getPaddingTop();
        String preMonthName;      //标记上一个item对应的Month
        String currentMonthName = null;       //当前item对应的Month
        for (int i = 0; i < childCount; i++) {
            View view = parent.getChildAt(i);

            int position = parent.getChildAdapterPosition(view);
            preMonthName = currentMonthName;
            currentMonthName = getMonthValue(position);
            if (currentMonthName == null || TextUtils.equals(currentMonthName, preMonthName))
                continue;
            int viewRight = view.getRight();
            float left = Math.max(mWidth, view.getLeft());//left 决定当前左侧第一个悬浮Group的位置
            if (position + 1 < itemCount) {
                //获取下个GroupName
                String nextGroupName = getMonthValue(position + 1);
                //下一组的第一个View接近头部
                if (!currentMonthName.equals(nextGroupName) && viewRight < left) {
                    left = viewRight;
                }
            }

            //根据left绘制month
            int parentBottom = parent.getBottom();
            c.drawRect(left - mWidth, top, left, parentBottom, mPaint);
            int index = currentMonthName.indexOf("月");
            String monthNum = currentMonthName.substring(0, index);
            String month = currentMonthName.substring(index, currentMonthName.length());
            c.drawText(monthNum, left - mWidth + 30, (parentBottom - top) / 2 - 10, mTextPaint);
            c.drawText(month, left - mWidth + 30, (parentBottom - top) / 2 + 30, mTextPaint);
        }

    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        super.getItemOffsets(outRect, view, parent, state);
        int childAdapterPosition = parent.getChildAdapterPosition(view);
        String monthValue = getMonthValue(childAdapterPosition);
        if (TextUtils.isEmpty(monthValue)) {
            return;
        }
        if (childAdapterPosition == 0 || isMonthShouldSticky(childAdapterPosition)) {
            outRect.left = mWidth;
        }
    }

相关文章

网友评论

      本文标题:Android实现title吸顶

      本文链接:https://www.haomeiwen.com/subject/otjlgctx.html