【问题标题】:RecylerView not animating insert, however it does animate removalRecyclerView 没有动画插入,但它确实动画删除
【发布时间】:2014-11-20 16:20:48
【问题描述】:

所以当我添加一个项目时,它不会为它设置动画,也不会滚动到正确的位置。但是,当我删除某些内容时,它会为对象删除设置动画。

这里是添加代码:

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode == NEWITEMREQUESTCODE && resultCode == Activity.RESULT_OK) {
            // AFTER CREATING A NEW ITEM
            OilChangeableItem oilChangeableItem = data.getParcelableExtra("oil_item");
            // Add the new item and notify the dataset.
            oilChangeableAdapter.notifyItemInserted(0);
            items.add(0, oilChangeableItem);
        } else if (requestCode == EDITITEMRESULTCODE && resultCode == Activity.RESULT_OK) {
            // AFTER EDITING AN ITEM
            OilChangeableItem oilChangeableItem = data.getParcelableExtra("oil_item");
            // Replace the existing item at whatever position it was originally at and notify the dataset.
            oilChangeableAdapter.notifyItemChanged(data.getIntExtra("item_position", 0));
            items.set(data.getIntExtra("item_position", 0), oilChangeableItem);
        }
    }

这里是删除代码:

final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
                    builder.setTitle(R.string.dialog_delete_title);
                    builder.setIcon(R.drawable.ic_action_warning);
                    builder.setMessage(R.string.dialog_delete_message);

                    builder.setPositiveButton(R.string.button_text_delete, new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            // Removed the selected item
                            oilChangeableAdapter.notifyItemRemoved(oilChangeableAdapter.getSelectedViewPosition());
                            items.remove(oilChangeableAdapter.getSelectedViewPosition());
                            // Notify the user it has been removed.
                            Toast.makeText(getActivity(), R.string.toast_item_deleted, Toast.LENGTH_SHORT).show();
                        }
                    });
                    builder.setNegativeButton(R.string.button_text_cancel, new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {

                        }
                    });
                builder.create();
                builder.show();
                mode.finish();

有人有什么想法吗?

【问题讨论】:

  • 为什么在实际插入项目之前调用notifyItemInserted
  • @rciovati 我后来试过了,还是不行:P

标签: java android android-recyclerview


【解决方案1】:

这是因为您将项目添加到当前可见项目的“上方”。

我知道如果您考虑第一个位置,这看起来很意外,但是如果 RV 显示的项目从 5 到 10 并且在位置 2 添加了一个新项目,那么您真的不希望您的列表移动到 4 到 9。

所以 LinearLayoutManager 保持简单,如果在列表上方或下方添加项目,它不会四处移动(这样 UX 是一致的)。

如果您希望在将项目添加到位置 0 时显示位置 0,请调用 recyclerView.scrollToPosition(0) 添加项目后。我想你真正想要的是:

items.add(0, oilChangeableItem);    
oilChangeableAdapter.notifyItemInserted(0);
if (layoutManager.findFirstCompletelyVisibleItemPosition() == 0) {
    layoutManager.scrollToPosition(0);
}

【讨论】:

  • 所以它会滚动到该项目,但它仍然不会像删除项目时那样为项目淡入动画。
  • 嗯,如果你调用滚动到位置,它应该。你在看什么?它只是跳跃而不是动画任何视图?
  • 是的,它会跳转到它。或者如果我只是第一次添加一个项目,它只会弹出并且不会淡入。
  • 这很奇怪。您没有将项目动画师设置为空吗?默认项目动画师不适用于姜饼,动画在省电模式下被禁用。如果你能上传一个示例项目,我很乐意看看它
  • :/,这是因为有问题的代码在 onActivityResult 中运行。附加后,RV 不会在第一个布局通道中运行动画,因为淡入所有内容看起来很奇怪:/。作为一种解决方法,您可以使用处理程序推迟将项目添加到下一帧。 10毫秒就可以了。 developer.android.com/reference/android/os/…,长)
猜你喜欢
  • 2015-01-27
  • 2018-07-29
  • 2016-06-15
  • 1970-01-01
  • 2015-03-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-07
  • 1970-01-01
相关资源
最近更新 更多