RecyclerView notifyItemRemoved无法设置动画并导致某些项目无法正确滚动

时间:2019-07-08 21:30:15

标签: android android-recyclerview

NotifyItemRemoved引起一些奇怪的视觉伪像。 ArrayList中的实际值已正确更改,只是没有正确地设置动画/清除屏幕。

点击项目之前

在这里您可以看到回收站视图。

点击项目后

单击一个项目后,它会提示确认消息。

确认项目后

确认一项后,文本会更改颜色。

点击眼睛后

理想情况下,单击项目可以隐藏所有选定的项目。 而是,该项目无法正确擦除。

项目未被删除

可点击的项目后面

实际上,该项目存在于未擦除项目的后面。

未擦除的项目被绘制在上方

有更多要擦除的项目会导致更多相同的错误。

点击眼睛会从其应有的位置(缺少马里奥装备)开始执行recyclerview,然后制作动画。

将项目读取到arrayList

                    for (int team = 0; team < 4; team++) {
                        for (int index = 0; index < spDrafted.get(team).size(); index++) {
                            adapter.notifyItemInserted(spDrafted.get(team).get(index).getPosition());
                            Log.d(TAG, "Eye Instered " + spDrafted.get(team).get(index).getName());
                            resetPositions();
                        }
                    }

从arrayList中删除项目

            for (int team = 0; team < 4; team++) {
                for (int index = 0; index < spDrafted.get(team).size(); index++) {
                    adapter.remove(spDrafted.get(team).get(index));
                    Log.d(TAG, "Eye removed " + spDrafted.get(team).get(index).getName());
                    resetPositions();
                }
            }

recyclerviewadapter中的删除功能

    void remove(character character) {

        fighters.remove(character);
        notifyItemRemoved(character.getPosition());
        Log.d(TAG,""+fighters.toString());
       // notifyItemRangeChanged(character.getPosition(),fighters.size());
    }

字符类

package com.example.smashdraft;
import java.io.Serializable;

public class character  implements Serializable, Comparable<character> {
    private int imageId;
    private String name;
    private int team;
    private int position;

    character(int image, String name){
        this.imageId = image;
        this.name = name;
        this.team = 0;
    }

    public int getImageId() {
        return imageId;
    }

    public void setImageId(int imageId) {
        this.imageId = imageId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getTeam() {
        return team;
    }

    public void setTeam(int team) {
        this.team = team;
    }

    public int getPosition() {
        return position;
    }

    public void setPosition(int position) {
        this.position = position;
    }

    @Override
    public int compareTo(character ch) {
        return this.getName().compareTo(ch.getName());
    }

    @Override
    public String toString(){
        return this.name;
    }

}

位置是角色在战斗机ArrayList中的位置,每次更新arrayList后都会更新位置。 如您所见,我尝试添加notifyItemRangeChanged,这将导致项目开始动画,然后跳回到其先前位置。

Notifydatasetchanged()可以正常工作,除了没有动画。

0 个答案:

没有答案