Android 如何跳过GridLayout的RecyclerView项目装饰中的第一行?

Android 如何跳过GridLayout的RecyclerView项目装饰中的第一行?,android,android-recyclerview,Android,Android Recyclerview,我正在使用这个ItemDecoration类进行GridLayout-> 但问题是,我在GridLayout中的第一行是一个图像,我将跨度设置为2 您可以根据下面的屏幕截图查看我的屏幕: 如何跳过第一行,使ItemEdition不会在图像上绘制 下面是我用来添加ItemDecoration的代码:- mRecyclerView.setHasFixedSize(true); mLayoutManager = new GridLayoutManager(getActivity(), 2); mLa

我正在使用这个ItemDecoration类进行GridLayout->

但问题是,我在GridLayout中的第一行是一个图像,我将跨度设置为2

您可以根据下面的屏幕截图查看我的屏幕:

如何跳过第一行,使ItemEdition不会在图像上绘制

下面是我用来添加ItemDecoration的代码:-

mRecyclerView.setHasFixedSize(true);
mLayoutManager = new GridLayoutManager(getActivity(), 2);
mLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
    @Override
    public int getSpanSize(int position) {
        return position == 0 ? 2 : 1;
    }
});
mRecyclerView.setLayoutManager(mLayoutManager);
mAdapter.setHighlightsCallbacks(this);
mRecyclerView.setAdapter(mAdapter);
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
mRecyclerView.addItemDecoration(new GridDividerDecoration(getActivity()));
我还修改了GridDividerDecoration类中的drawHorizontal方法,使其仅在imageview为null但仍不工作时绘制:-

public void drawHorizontal(Canvas c, RecyclerView parent) {

    final int top = parent.getPaddingTop();
    final int bottom = parent.getHeight() - parent.getPaddingBottom();

    final int childCount = parent.getChildCount();

    for (int i = 0; i < childCount; i++) {
        final View child = parent.getChildAt(i);
        if (child.findViewById(R.id.home_imgHeader) == null) {
            final RecyclerView.LayoutParams params =
                    (RecyclerView.LayoutParams) child.getLayoutParams();
            final int left = child.getRight() + params.rightMargin + mInsets;
            final int right = left + mDivider.getIntrinsicWidth();
            mDivider.setBounds(left, top, right, bottom);
            mDivider.draw(c);
        }
    }
}
public void drawHorizontal(画布c,回收视图父对象){
final int top=parent.getPaddingTop();
final int bottom=parent.getHeight()-parent.getPaddingBottom();
final int childCount=parent.getChildCount();
for(int i=0;i

有什么帮助吗?

假设您的项目没有单独的固体背景(即白色来自父项),最简单的修复方法是将代码从
onDrawOver()
移动到
onDraw()
。这将在子视图内容下方绘制网格线,并将隐藏在标题图像下方

否则,您使用的代码将假定网格线始终绘制到
drawHorizontal()
中视图的顶部(请注意
top
是一个永不更改的值)。您需要修改该函数以说明第一项的底部,并在那里开始绘图。比如:

public void drawHorizontal(Canvas c, RecyclerView parent) {
    final View topView = parent.findViewHolderForAdapterPosition(0);
    int viewBottom = -1;
    if (topView != null) {
        final RecyclerView.LayoutParams params =
            (RecyclerView.LayoutParams) child.getLayoutParams();
        viewBottom = child.getBottom() + params.bottomMargin + mInsets;
    }

    final int top = viewBottom > parent.getPaddingTop() ? viewBottom : parent.getPaddingTop();
    final int bottom = parent.getHeight() - parent.getPaddingBottom();

    … /* Remaining Code */
}

任何反对票的原因??两种解决方案都从onDrawOver变为onDraw,drawHorizontal方法工作得非常好。谢谢@Devunwired我还是android的新手。