Android 使用不同的工具重置回收器视图装饰

Android 使用不同的工具重置回收器视图装饰,android,android-recyclerview,android-diffutils,item-decoration,Android,Android Recyclerview,Android Diffutils,Item Decoration,我有一个使用diff-utils更新的grid recycler视图,但是如果列表数据中的某些内容导致项目从第一行下方的任何一行移动到第一行,则装饰缺少填充顶部,这是意料之中的,因为如果项目位于第一行,我只会将填充添加到列表中项目的顶部。然后我在每个项目中添加底部填充 回收商查看装饰 public class GridSpacing extends RecyclerView.ItemDecoration { private final int spacing;

我有一个使用diff-utils更新的grid recycler视图,但是如果列表数据中的某些内容导致项目从第一行下方的任何一行移动到第一行,则装饰缺少填充顶部,这是意料之中的,因为如果项目位于第一行,我只会将填充添加到列表中项目的顶部。然后我在每个项目中添加底部填充

回收商查看装饰

    public class GridSpacing extends RecyclerView.ItemDecoration {
        private final int spacing;
        private final int numColumns;

        public  GridSpacing(int spacing, int numColumns) {
            this.spacing = spacing;
            this.numColumns = numColumns;
        }

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

            int position = parent.getChildLayoutPosition(view);

            if (position < numColumns){
                outRect.top = spacing;
            }

            if (position % 2 != 0) {
                outRect.right = spacing;
            }

            outRect.left = spacing;
            outRect.bottom = spacing;

        }
    }
公共类GridSpacing扩展了RecyclerView.ItemDecoration{
私有最终整数间距;
私人最终国际货币专栏;
公共网格间距(整数间距、整数列){
这个。间距=间距;
this.numColumns=numColumns;
}
@凌驾
public void getItemOffset(@NonNull Rect outRect、@NonNull View View View、@NonNull RecyclerView parent、@NonNull RecyclerView.State){
int position=parent.getChildLayoutPosition(视图);
if(位置

如果我调用notifyDatasetChanged,这将重新计算我的装饰并将填充添加到顶行,但diff-utils没有调用notifyDatasetChanged(认为它调用了项目范围更改、项目插入、项目删除的组合以保持动画),因此我的装饰不会重新应用,我自己可能会重新使用它,但每次物品发生变化时,都必须移除并重新应用装饰,这似乎是一种黑客行为,有人知道更好的方法吗?

因此,我不打算重新应用装饰器,而是在装饰器中删除填充顶部,而是在顶部添加填充,并在回收器视图中剪裁为padding false

  <androidx.recyclerview.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingTop="8dp"
        android:clipToPadding="false"
        android:id="@+id/recyclerView"/>


装饰器中是否需要此顶部填充物?如果顶部填充仅影响第一行,那么将该空白置于
RecyclerView
之外是否可以实现相同的视觉效果?不完全是,尽管您是对的,它会在每件物品前面留出空白scrolls@CommonsWare…看起来用剪辑填充就可以了如果你想回答这个问题我会接受@commonware