我正在使用Room RecyclerView,如下所述:https://codelabs.developers.google.com/codelabs/android-room-with-a-view/

然后我添加了"left swipe"列表元素的删除,如下所述:https://www.androidhive.info/2017/09/android-recyclerview-swipe-delete-undo-using-itemtouchhelper/

它可以工作,但是当我从列表中删除它后从数据库中删除该项目时,滚动列表以填充空白空间的动画不再起作用:

(excerpt from ListFragment)
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction, int position)
{
    if (viewHolder instanceof mdcPointListAdapter.mdcPointViewHolder)
    {
        mdcPointListAdapter pointListAdapter = ((mdcPointListAdapter) (recyclerView.getAdapter()));
        List<mdcPoint> mdcPoints = pointListAdapter.getPoints();
        // get the removed item name to display it in snack bar
        String name = mdcPoints.get(viewHolder.getAdapterPosition()).toString();

        // backup of removed item for undo purpose
        final mdcPoint deletedItem = mdcPoints.get(viewHolder.getAdapterPosition());
        final int deletedIndex = viewHolder.getAdapterPosition();

        **// remove the item from recycler view
        pointListAdapter.removeItem(viewHolder.getAdapterPosition());
        // remove the item from database through the ViewModel linked to Room database
        mPointViewModel.delete(deletedItem);**

        // showing snack bar with Undo option
        Snackbar snackbar = Snackbar
                .make(mainLayout, name + " " + getString(R.string.removed_from_list), Snackbar.LENGTH_LONG);
        snackbar.setAction(R.string.undo, view ->
        {
            // undo is selected, restore the deleted item
            pointListAdapter.restoreItem(deletedItem, deletedIndex);
            mPointViewModel.insert(deletedItem);
        });
        snackbar.setActionTextColor(Color.YELLOW);
        snackbar.show();
    }

}

相关部分是

// remove the item from recycler view
        pointListAdapter.removeItem(viewHolder.getAdapterPosition());
        // remove the item from database through the ViewModel linked to Room database
        mPointViewModel.delete(deletedItem);

我的解释是,由于ListFragment "observes"数据库,只要用 mPointViewModel.delete 删除该项,它就会请求更新列表,并立即取消刚启动的动画 .

我还试图覆盖RecyclerView动画师的 onRemoveFinished 并将 mPointViewModel.delete 放在那里,但没有改变 .

我找到的唯一解决方法是延迟产生 mPointViewModel.delete 400毫秒的线程:在这种情况下动画结束,但这个解决方案似乎不太专业 .

有没有更合适的方法来实现这一目标?

谢谢 .