Android RecyclerView узнает первый и последний взгляд на ItemDecoration

Вот мой сценарий

  • Я должен добавить место на первом и последнем элементе Recycler View
  • Я делаю это, используя ItemDecoration

     recyclerView.addItemDecoration(new RecyclerView.ItemDecoration() {
    
    
        @Override
        public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
            int totalHeight = parent.getHeight();
            int viewHeight = getResources().getDimensionPixelOffset(R.dimen.breadcrumb_btn_height);
            int padding = (totalHeight - viewHeight) / 2;
            //to position view on middle
            if (view.getTag() instanceof Integer) {
                int position = (int) view.getTag();
                if (position == 0) {
                    //first position
                    outRect.set(padding, padding, 0, padding);
                } else if (position == linearLayoutManager.getItemCount() - 1)   {
                    //last position
                    outRect.set(0, padding, padding, padding);
                } else {
                    outRect.set(0, padding, 0, padding);
                }
            }
    
    
        }
    });
    

    Здесь у меня есть

  • LinearLayoutManager с Horizontal Orientation

    Я добавляю position пометить на RecyclerView Adapter следующим образом

    @Override
    public void onBindViewHolder(BreadCrumbViewHolder holder, int position) {
    holder.setPosition(position);
    }
    

    Есть ли другой способ доступа RecyclerView первый и последний ребенок на ItemDecoration так что в дальнейшем удаление и добавление элементов не будет иметь никаких проблем.

1 ответ

Решение

Есть ли какой-либо другой способ доступа к RecyclerView первым и последним дочерним элементам ItemDecoration, чтобы в дальнейшем удаление и добавление элементов не вызывало проблем.

Да. Вы можете достичь того, чего хотите, только внедрив свой собственный ItemDecoration,

Чтобы получить текущую позицию / дочернюю позицию:

int position = parent.getChildAdapterPosition(view);

Чтобы получить количество предметов / детей:

int itemCount = state.getItemCount();

При этом вы можете добавить пробел в первый и последний ребенок вашего RecyclerView,


Теперь, изменив код для этого подхода, вы получите:

@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
    super.getItemOffsets(outRect, view, parent, state);

    //your padding...

    final int itemPosition = parent.getChildAdapterPosition(view);
    if (itemPosition == RecyclerView.NO_POSITION) {
        return;
    }

    final int itemCount = state.getItemCount();

    /** first position */
    if (itemPosition == 0) {
        outRect.set(padding, padding, 0, padding);
    }
    /** last position */
    else if (itemCount > 0 && itemPosition == itemCount - 1) {
        outRect.set(0, padding, padding, padding);
    }
    /** positions between first and last */
    else {
        outRect.set(0, padding, 0, padding);
    }
}

Бонус: если вы хотите добавить отступы всем элементам RecyclerView, взгляните на созданный мной гист: https://gist.github.com/ryanamaral/93b5bd95412baf85a81a

Другие вопросы по тегам