Как пропустить первую строку в дизайне Item RecyclerView для GridLayout?

Я использую этот класс ItemDecoration для GridLayout → https://github.com/devunwired/recyclerview-playground/blob/master/app/src/main/java/com/example/android/recyclerplayground/GridDividerDecoration.java

Но проблема в том, что моя первая строка в GridLayout - это изображение, и я установил span на 2.

Вы можете просмотреть мой экран в соответствии с скриншотом ниже:

Screenshot

Как пропустить первую строку, чтобы ItemDecoration не рисовал изображение?

Ниже приведен код, который я использую для добавления 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()));

Я также модифицировал drawHorizontal метод в классе GridDividerDecoration, чтобы рисовать только если изображение имеет значение 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);
        }
    }
}

Любая помощь?

Ответ 1

Предполагая, что ваши элементы не имеют индивидуального твердого фона (т.е. белый цвет от родителя), самым простым решением было бы переместить код с 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 */
}