首页 > 解决方案 > android listview删除动画是自动删除第二项

问题描述

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

// 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,所以我在删除之前折叠单元格,因此postDelayed. 下面deleteCell是简单的动画:

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除了制造虚假并解决由此产生的其他问题外,我找不到一个好的解决方案。

标签: androidandroid-listviewandroid-animationandroid-arrayadapter

解决方案


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

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

对此:

@Override

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

我要items传递给. Item 是我的类,它包含每个项目的元素/视图,并且是我必须返回每个项目的整数的 getterarraylistadaptergetId()idItem


推荐阅读