【问题标题】:Recycler ItemDecoration item appearing over recycler view itemsRecycler ItemDecoration item出现在recycler view items上
【发布时间】:2019-11-11 21:04:06
【问题描述】:

我需要在 recyclerview 中添加粘性标题。我使用了RosterRecyclerItemDecoration,它给了我想要的结果。

问题是Decorator 项目出现在recycler view 的项目之上。

我想在 recyclerview 项目之间添加装饰器项目,而不是在 recyclerview 项目之上。

这是我的代码。

RosterRecyclerItemDecoration rosterRecyclerItemDecoration =
                new RosterRecyclerItemDecoration(true,
                        this);
 rvLeaders.addItemDecoration(rosterRecyclerItemDecoration);

装饰器类:

 public class RosterRecyclerItemDecoration extends RecyclerView.ItemDecoration {


 public RosterRecyclerItemDecoration(boolean sticky,@NonNull IDecoraterCallback iDecoraterCallback){
        this.sticky= sticky;
        this.iDecoraterCallback= iDecoraterCallback;
    }



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

        CharSequence previousHeader = "";

        if (headerView == null) {
            headerView = inflateHeaderView(parent);
            header = (TextView) headerView.findViewById(R.id.tvHeader);
            fixLayoutSize(headerView, parent);
        }


        for (int i = 0; i < parent.getChildCount(); i++) {
            View child = parent.getChildAt(i);
            final int position = parent.getChildAdapterPosition(child);

            if(iDecoraterCallback.getSectionHeader(position) !=null) {
                CharSequence title = iDecoraterCallback.getSectionHeader(position);
                header.setText(title);

                if (!previousHeader.equals(title)) {                
                    drawHeader(c, child, headerView);
                    previousHeader = title;
                    }  
            }
        }
    }

【问题讨论】:

    标签: android android-layout android-recyclerview stickyrecycleview


    【解决方案1】:

    你必须使用 Rect 来绘制你的装饰器。在您的RosterRecyclerItemDecoration 构造函数中,您可以传递一个高度,例如 40 或 50 dp,它取决于您的布局。

    现在在您的 RosterRecyclerItemDecoration 类中覆盖 getItemOffsets 它看起来像:

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

    在这种覆盖方法中,您可以设置您的高度。喜欢outRect.top = headerOffset; [检查这个视图是你的sectionHeader]

    注意:这里的 headerOffset 是您在 RosterRecyclerItemDecoration 构造函数中发送的高度。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-19
      • 2021-10-18
      • 1970-01-01
      • 1970-01-01
      • 2018-06-23
      • 1970-01-01
      相关资源
      最近更新 更多