0

我需要在 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;
                    }  
            }
        }
    }
4

1 回答 1

0

你必须使用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构造函数中发送的高度。

于 2019-07-01T09:22:13.273 回答