【问题标题】:Android RecyclerView finding out first and last view on ItemDecorationAndroid RecyclerView 找出 ItemDecoration 的第一个和最后一个视图
【发布时间】:2015-05-25 23:26:32
【问题描述】:

这是我的场景

  • 我必须在 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);
                }
            }
    
    
        }
    });
    

    我来了

  • LinearLayoutManagerHorizontal Orientation

    我通过以下方式在RecyclerView Adapter上添加position标签

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

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

【问题讨论】:

    标签: android android-recyclerview


    【解决方案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 的所有项目提供填充,请查看我创建的 Gisthttps://gist.github.com/ryanamaral/93b5bd95412baf85a81a

    【讨论】:

    • 很棒的人。谢谢。一定要添加parent.getChildPosition(view) 而不是parent.getChildAdapterPosition(view)
    • @laaptu getChildPosition 方法已被弃用。文档说要使用 getChildAdapterPosition 或 getChildLayoutPosition。
    • 在这种情况下,我认为您应该将getChildLayoutPosition(view)state.getItemCount() 结合使用,而不是getChildAdapterPosition(view)。它们考虑了当前布局通道中的位置,这些位置可能比适配器中的位置晚。
    • 我不敢相信,在最初回答 4 年后,没有人发现这在所有情况下都不起作用。如果您阅读 State.getItemCount() 的文档,您会发现新添加的项目未反映在此计数中。这意味着您对“第一”或“最后”位置的计算是错误的。
    • @ievgen docs 并没有真正反映您声称“新添加的项目未反映在此计数中”的说法。它确实说新添加的项目不会反映在预布局通道中,但它们会在第二个布局通道中看到。
    猜你喜欢
    • 1970-01-01
    • 2020-12-23
    • 2012-06-11
    • 2020-08-20
    • 2011-12-14
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2019-03-12
    相关资源
    最近更新 更多