2

我有一个使用 diff utils 更新的网格回收器视图,但如果列表数据中的某些内容导致项目从第一行下方的任何行到第一行,那么装饰缺少顶部填充,这是预期的因为如果它位于第一行,我只会在列表中的项目顶部添加填充。然后我为每个项目添加底部填充,

回收站视图装饰

    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;

        }
    }

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

4

1 回答 1

0

因此,我不会尝试重新应用装饰器,而是要删除装饰器中的填充顶部,而是将填充添加到顶部并在回收器视图上剪辑到填充 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"/>
于 2020-02-19T08:51:04.420 回答