【问题标题】:android listview deletion animation is automatically deleting a second itemandroid listview删除动画是自动删除第二项
【发布时间】:2019-11-18 08:46:08
【问题描述】:

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

// 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 设为 false 并解决由此产生的其他问题外,我找不到一个好的解决方案。

【问题讨论】:

    标签: android android-listview android-animation android-arrayadapter


    【解决方案1】:

    解决了!使用 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();
    }
    

    其中itemsarraylist 我将传递给adapter。 Item 是我的类,它包含每个项目的元素/视图,getId() 是我必须返回每个 Itemid 整数的吸气剂

    【讨论】:

      猜你喜欢
      • 2012-09-17
      • 2019-01-25
      • 2020-09-18
      • 1970-01-01
      • 2011-04-25
      • 1970-01-01
      • 2012-06-22
      • 2023-04-07
      相关资源
      最近更新 更多