#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;
если это не работает, просто прокомментируйте эту строку и попробуйте.