android 列表视图删除动画自动删除第二个项目

android listview deletion animation is automatically deleting a second item

我有一个带有自定义适配器的列表视图。每个项目都有一个删除图标,提示删除对话框片段。在删除项目时,我正在执行幻灯片动画并在动画结束时执行。该项目已从列表中删除,适配器会收到有关删除的通知,如下所示:

// dialog fragment on clicking "delete"
positive.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                final FoldingCell fView = (FoldingCell) thisItem.getParent().getParent();

// wait for fold to finish then delete item
                fView.postDelayed(new Runnable() {
                    @Override
                    public void run() {

                        deleteCell(fView, pos);

                    }
                }, 850);

我的适配器是 FoldingCell 类型,所以我在删除之前折叠单元格,因此 postDelayeddeleteCell是下面的简单动画:

private void deleteCell(final View v, final int index) {

    TranslateAnimation transanim = new TranslateAnimation(0, 800, 0, 0);
    transanim.setDuration(700);

    transanim.setAnimationListener(new Animation.AnimationListener() {
        @Override
        public void onAnimationStart(Animation animation) {

        }

        @Override
        public void onAnimationEnd(Animation animation) {
            items.remove(index);

            // update array adapter
            adapter.notifyDataSetChanged();
            v.setVisibility(View.GONE);

        }

        @Override
        public void onAnimationRepeat(Animation animation) {

        }
    });
    v.startAnimation(transanim);
}

重要的是我也在使用 stableIds,这可能会导致问题。动画删除发生后,适配器将删除两项,而不仅仅是单击的一项。当我在上面的代码中禁用动画时,只写

    items.remove(index);
    adapter.notifyDataSetChanged();

恰好在删除时,即使使用 stable ids 也能完美删除(只是没有动画),这是为什么呢?问题似乎是动画和 stable ids 的组合,因为如果 stableids 为假,则删除与动画一起使用。

除了使 stable ids 为假并解决由此产生的其他问题外,我找不到好的解决方案。

已解决!使用 stableids 适配器删除额外字段的原因是,当我覆盖 getItemId 时,我正在 returning 适配器位置本身,我猜,在动画期间,当一个项目被删除时,那个相同的位置 ID 被另一个列表项占用,该列表项也被删除。通过 returning 列表项唯一的不同 itemId,不会发生此错误。所以我改变了这个:

@Override
    public long getItemId(int position) {
        return position;
    }

对此:

@Override

public long getItemId(int position) {
    Item item = items(position);
    return item.getId();
}

其中 items 是我传递给 adapterarraylist。 Item 是我的 class,它包含每个项目的 elements/views,getId() 是 getter 我必须 return 每个 id 整数=18=]