Android RecyClerview删除项目动画错误



我正在尝试实现一个列表,其中包含一个列表和其他视图在活动页面上的其他视图。

我在整个页面上使用LinearLayout,列表使用RecyclerView,以及RecyclerView下方的其他视图(ImageViewButtons ...等)

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

<LinearLayout>
    <TextView />
    <RecyclerView />
    <Button />
    <EditText />
    <ImageView />
</LinearLayout>

我已经实施了RecyclerView,可以添加和删除项目。我使用的是LinearLayoutManager,而无需指定ItemAnimator,因此使用DefaultItemAnimator

将项目添加到列表中,按预期工作。我的问题是,当i remove RecyclerView中删除项目时,页面并不能很好地动画(通过先从数据集中删除,然后使用RecyclerViewAdapter.notifyItemRemoved)。

发生的事情是首先要捕捉到新的RecyclerView高度,然后RecyclerView项目删除动画完成,这使得页面的行为看起来很奇怪,因为RecyclerView下方的所有视图在删除时都会删除。项目逐渐消失,但尚未损失高度,然后剩下的RecyclerView项目(在已删除的项目下方)向上滚动,看起来它们从墙下面滑动。

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

我发现了这个未解决的问题,描述了同样的问题。如果我的解释还不够清楚,请参考它。

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

谢谢。

我也有同样的问题。在我的情况下,这条线有所帮助:

recyclerView.setHasFixedSize(true);

尝试此操作,并检查它是否可以作为您的期望:

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;
        }
    }

创建RecyclerView的子类和覆盖onTouchEvent类似的方法:

@Override
public boolean onTouchEvent(MotionEvent e) {
    if (findChildViewUnder(e.getX(), e.getY()) == null) {
        return false;
    }
    return super.onTouchEvent(e);
}

另外,请勿将wrap_content用作RecyclerView高度/宽度,具体取决于您的方向。

这样,RecyclerView的尺寸固定,并且在删除项目时不会切断项目。onTouchEvent方法的操作确保RecyclerView的一部分不消耗单击事件,并将其发送到RecyclerView的父视图。

您需要设置回收瓶的高度或将其保存到的容器中:'match_parent''。对我来说像Cahrm一样工作。

来源:https://medium.com/mobile-app-development-publication/recyclerview-supported-wrap-content-not-quntent-not-quite-f04a942ce624

最新更新