Android RecyclerView查找ItemDecoration的第一个和最后一个视图

laa*_*ptu 18 android android-recyclerview

这是我的情景

  • 我必须在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);
                }
            }
    
    
        }
    });
    
    Run Code Online (Sandbox Code Playgroud)

    我有

  • LinearLayoutManagerHorizontal Orientation

    我正在以下列方式添加position标记RecyclerView Adapter

    @Override
    public void onBindViewHolder(BreadCrumbViewHolder holder, int position) {
    holder.setPosition(position);
    }
    
    Run Code Online (Sandbox Code Playgroud)

    有没有其他方法来访问RecyclerView第一个和最后一个孩子,ItemDecoration以便以后删除和添加项目将没有任何问题.

Rya*_*ral 46

有没有其他方法可以在ItemDecoration上访问RecyclerView的第一个和最后一个子项,以便以后删除和添加项目不会有任何问题.

是.只有实现自己的目标,才能实现自己想要的目标ItemDecoration.

获取当前项目/子项位置:

int position = parent.getChildAdapterPosition(view);
Run Code Online (Sandbox Code Playgroud)

要获得物品/孩子的数量:

int itemCount = state.getItemCount();
Run Code Online (Sandbox Code Playgroud)

有了它,你可以在你的第一个和最后一个孩子上添加一个空格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);
    }
}
Run Code Online (Sandbox Code Playgroud)

额外奖励:如果您希望为RecyclerView的所有项目提供填充,请查看我创建的Gist:https://gist.github.com/ryanamaral/93b5bd95412baf85a81a

  • 我不敢相信,在最初的回答四年后,没有人发现这并不适用于所有情况。如果您阅读 State.getItemCount() 的文档,您会发现新添加的项目未反映在此计数中。这意味着您对“第一个”或“最后一个”位置的计算是错误的。 (4认同)
  • 了不起的人。谢谢。一定要添加`parent.getChildPosition(view)` 而不是`parent.getChildAdapterPosition(view)` (2认同)
  • 在这种情况下,我认为您应该将“getChildLayoutPosition(view)”与“state.getItemCount()”结合使用,而不是“getChildAdapterPosition(view)”。它们说明当前布局过程中的位置,这些位置可能比适配器中的位置新。 (2认同)