Добавление ItemDecoration в представление Recycler приводит к сокращению заголовков

#android #xamarin #android-recyclerview

#Android #xamarin #android-recyclerview

Вопрос:

У меня есть RecyclerView, который использует StaggeredGridLayoutManager для отображения элементов, разделенных по дате. Для каждого раздела (день) У меня есть представление заголовка, которое вставляется в представление recycler, и в моем методе OnBindViewHolderAction я устанавливаю заголовки на полный охват. Моя проблема в том, что когда я добавляю свой ItemDecoration в RecyclerView, чтобы указать интервал между всеми элементами, представления заголовков покрываются интервалом (как если бы добавлялось дополнение без увеличения размера представления) вместо добавления интервала между полями. Я не уверен, где искать дальше, любые предложения были бы полезны. Спасибо.

Без оформления элементов с интервалом: введите описание изображения здесь

С оформлением элементов с интервалом: введите описание изображения здесь

Как это должно выглядеть: введите описание изображения здесь

Это последнее изображение является тем же RecyclerView и ItemDecoration, но в GridLayoutManager вместо StaggeredGridLayoutManager.

 public void OnBindViewHolderAction(RecyclerView.ViewHolder holder, int position)
    {
        var item = _collectionAdapter.SectionedList[position];
        if (holder is ActivityFeedItemViewHolder) {
            var viewHolder = (ActivityFeedItemViewHolder)holder;
            viewHolder.Bind((ActivityFeedItemViewModel)item);
            StaggeredGridLayoutManager.LayoutParams layoutParams = (StaggeredGridLayoutManager.LayoutParams)holder.ItemView.LayoutParameters;
            layoutParams.FullSpan = false;

        }
        if (holder is RecyclerHeaderViewHolder) {
            var viewHolder = (RecyclerHeaderViewHolder)holder;
            viewHolder.Initialize(((RecyclerViewHeaderItem)item).SectionName);
            StaggeredGridLayoutManager.LayoutParams layoutParams = (StaggeredGridLayoutManager.LayoutParams)holder.ItemView.LayoutParameters;
            layoutParams.FullSpan = true;
        }
    }



public override void GetItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state)
    {
  

// STACKOVERFLOW ПРИМЕЧАНИЕ: _headerTypeId устанавливается в 0 при вызове метода

         int pos = parent.GetChildAdapterPosition(view);

        // apply top spacing to first header only if there is one
        if (pos == 0 amp;amp; _headerTypeId != -1) {
            outRect.Top = 2 * _spacing;
        }

        // these are fixed spacings for all cells
        outRect.Bottom = 2 * _spacing;
        outRect.Left = _spacing;
        outRect.Right = _spacing;

        // only apply spacing to the top row if we don't have headers
        if (_headerTypeId == -1) {

            // adjust the position index to account for headers
            for (int i = 0; i < pos; i  ) {
                if (parent.GetAdapter().GetItemViewType(i) == _headerTypeId) {
                    pos--;
                }
            }

            // apply top spacing to only the top row of cells
            if (pos < _layoutManager.SpanCount) {
                outRect.Top = 2 * _spacing;
            }
        }
    }
  

Комментарии:

1. имеет ли высота макета заголовка значение wrap_content?

2. Это была проблема @Eugen Pechanec. Спасибо.

Ответ №1:

Итак, я смог исправить это, просто установив высоту представления заголовка для переноса содержимого вместо того, чтобы устанавливать для него значение в axml (32dp в моем случае). Благодаря Евгению Печанеку.

Комментарии:

1. Попробуйте добавить android:minHeight="32dp" , чтобы получить желаемый результат.

Ответ №2:

изменить

 outRect.Top = 2 * _spacing;
  

Для

 outRect.Top =_spacing;
  

если это не работает, просто прокомментируйте эту строку и попробуйте.