Android RecyclerView删除项目动画错误

Cop*_*y33 5 animation android android-animation android-layout android-recyclerview

我正在尝试实现一个待办事项列表,该列表在活动页面上包含一个列表及其下的一些其他视图。

LinearLayout在整个页面和RecyclerView列表中都使用,以及RecyclerViewImageViewButtons...等)下面的其他视图

这是我的最终视图层次结构:

<LinearLayout>
    <TextView />
    <RecyclerView />
    <Button />
    <EditText />
    <ImageView />
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

我已经实现了RecyclerView可以在其中添加和删除项目的地方。我正在使用LinearLayoutManager而未指定ItemAnimatorso DefaultItemAnimator则被使用。

将项目添加到列表中可以正常工作。我的问题是,当我从中删除项目RecyclerView(通过先从数据集中删除项目然后使用RecyclerViewAdapter.notifyItemRemoved),页面的动画效果不佳

发生的情况是,整个页面首先对齐以适应新的RecyclerView高度,然后RecyclerView项目删除动画完成,这使得页面的行为看起来很奇怪,因为下面的所有视图都被RecyclerView对齐,而删除的项目逐渐淡出但没有牛逼失去了它的高度还没有,那么剩余的RecyclerView项目(已删除的项目如下图)滚动起来,看上去就像他们从墙下往上滑动。

我试图在网络上寻找解决方案,却找不到任何能解决我问题的方法。

我发现这个无法回答的问题描述了同样的问题。如果我的解释不够清楚,请参考它。

有人遇到同样的问题吗?有什么建议么?

谢谢。

Div*_*tel 1

尝试一下这个并检查它是否按照您的预期工作:

recyclerView.setHasFixedSize(true);
recyclerView.setItemAnimator(new MyAnim());


public static class MyAnim extends RecyclerView.ItemAnimator {
        @Override
        public boolean animateDisappearance(@NonNull RecyclerView.ViewHolder viewHolder, @NonNull ItemHolderInfo preLayoutInfo, @Nullable ItemHolderInfo postLayoutInfo) {
            return false;
        }

        @Override
        public boolean animateAppearance(@NonNull RecyclerView.ViewHolder viewHolder, @Nullable ItemHolderInfo preLayoutInfo, @NonNull ItemHolderInfo postLayoutInfo) {
            return false;
        }

        @Override
        public boolean animatePersistence(@NonNull RecyclerView.ViewHolder viewHolder, @NonNull ItemHolderInfo preLayoutInfo, @NonNull ItemHolderInfo postLayoutInfo) {
            return false;
        }

        @Override
        public boolean animateChange(@NonNull RecyclerView.ViewHolder oldHolder, @NonNull RecyclerView.ViewHolder newHolder, @NonNull ItemHolderInfo preLayoutInfo, @NonNull ItemHolderInfo postLayoutInfo) {
            final float prevAlpha = ViewCompat.getAlpha(oldHolder.itemView);

            ViewCompat.setAlpha(oldHolder.itemView, prevAlpha);

            ViewCompat.setAlpha(newHolder.itemView, 0);

            return true;
        }

        @Override
        public void runPendingAnimations() {

        }

        @Override
        public void endAnimation(RecyclerView.ViewHolder item) {

        }

        @Override
        public void endAnimations() {

        }

        @Override
        public boolean isRunning() {
            return false;
        }
    }
Run Code Online (Sandbox Code Playgroud)