Java 如何阻止Recyclerview生成重复项并停止洗牌项目?

Java 如何阻止Recyclerview生成重复项并停止洗牌项目?,java,android,android-layout,android-recyclerview,Java,Android,Android Layout,Android Recyclerview,我是这里的新手,正在开发notes应用程序。我注意到我在recyclerview中的笔记在滚动时被复制并移动位置。我花了很多时间修改代码,但运气不好。希望你们能通读代码。谢谢你们抽出时间 @Override public void clicked(int clickedposition, View v, int iditem, String textitem) { try { switch (v.getId()) { case R.id.butto

我是这里的新手,正在开发notes应用程序。我注意到我在recyclerview中的笔记在滚动时被复制并移动位置。我花了很多时间修改代码,但运气不好。希望你们能通读代码。谢谢你们抽出时间

@Override
public void clicked(int clickedposition, View v, int iditem, String textitem) {
    try {
        switch (v.getId()) {
            case R.id.button2:
                entries = adapter.getnotesentries();// entries of notes in my list
                int n = db.Dao().delete(entries.get(clickedposition));
                retrievetasks();

                break;
            case R.id.textView2:
                Intent intent = new Intent(MainActivity.this, Notes.class);
                intent.putExtra("newnotes", defaultnotes);
                intent.putExtra("id", iditem);
                intent.putExtra("text", textitem);
                startActivity(intent);
                break;
        }

    } catch (Exception E) {
        E.printStackTrace();
    }

}
**相关的适配器代码是**

                public void setdata(List<NotesEntry> notesEntries) {
                    notesEntryList=notesEntries;  //i used your code here .it gives a null pointer exception
                    notifyDataSetChanged();
                }

                public List<NotesEntry> getnotesentries() {
                    return notesEntryList;
                }

                @Override
                public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
                    try {

                        int i = v1.getAdapterPosition();
                        NotesEntry notesEntries = notesEntryList.get(position);
                        id = notesEntries.getId();
                        text = notesEntries.getText();
                        Log.d("idies", text);
                        b1.setText(String.valueOf(id));
                        textview1.setText(text);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }



                public interface Itemlistener {
                    void clicked(int clickedposition, View v, int id, String text);

                }

                class Viewholder1 extends RecyclerView.ViewHolder implements View.OnClickListener {
                    public Viewholder1(@NonNull View itemView) {
                        super(itemView);
                        textview1 = (TextView) itemView.findViewById(R.id.textView2);
                        b1 = (Button) itemView.findViewById(R.id.button2);

                        b1.setOnClickListener(this);
                        textview1.setOnClickListener(this);

                        Log.d("ViewHolder1", "h");
                    }

                    @Override
                    public void onClick(View view) {

                        itemlistener.clicked(getAdapterPosition(), view, notesEntryList.get(getAdapterPosition()).getId(), notesEntryList.get(getAdapterPosition()).getText());

                    }
                }

            }
@Override
public void clicked(int clickedposition, View v, int iditem, String textitem) {
    try {
        switch (v.getId()) {
            case R.id.button2:
                entries = adapter.getnotesentries();// entries of notes in my list
                int n = db.Dao().delete(entries.get(clickedposition));
                retrievetasks();

                break;
            case R.id.textView2:
                Intent intent = new Intent(MainActivity.this, Notes.class);
                intent.putExtra("newnotes", defaultnotes);
                intent.putExtra("id", iditem);
                intent.putExtra("text", textitem);
                startActivity(intent);
                break;
        }

    } catch (Exception E) {
        E.printStackTrace();
    }

}
}`

@Override
public void clicked(int clickedposition, View v, int iditem, String textitem) {
    try {
        switch (v.getId()) {
            case R.id.button2:
                entries = adapter.getnotesentries();// entries of notes in my list
                int n = db.Dao().delete(entries.get(clickedposition));
                retrievetasks();

                break;
            case R.id.textView2:
                Intent intent = new Intent(MainActivity.this, Notes.class);
                intent.putExtra("newnotes", defaultnotes);
                intent.putExtra("id", iditem);
                intent.putExtra("text", textitem);
                startActivity(intent);
                break;
        }

    } catch (Exception E) {
        E.printStackTrace();
    }

}

如果需要,我将提供额外的代码。

从数据库中删除项目后,您应该:

@Override
public void clicked(int clickedposition, View v, int iditem, String textitem) {
    try {
        switch (v.getId()) {
            case R.id.button2:
                entries = adapter.getnotesentries();// entries of notes in my list
                int n = db.Dao().delete(entries.get(clickedposition));
                retrievetasks();

                break;
            case R.id.textView2:
                Intent intent = new Intent(MainActivity.this, Notes.class);
                intent.putExtra("newnotes", defaultnotes);
                intent.putExtra("id", iditem);
                intent.putExtra("text", textitem);
                startActivity(intent);
                break;
        }

    } catch (Exception E) {
        E.printStackTrace();
    }

}
  • 重新加载整个列表并重置适配器(更改列表 和
    setData()
    中的
    notifyDataSetChanged()

  • @Override
    public void clicked(int clickedposition, View v, int iditem, String textitem) {
        try {
            switch (v.getId()) {
                case R.id.button2:
                    entries = adapter.getnotesentries();// entries of notes in my list
                    int n = db.Dao().delete(entries.get(clickedposition));
                    retrievetasks();
    
                    break;
                case R.id.textView2:
                    Intent intent = new Intent(MainActivity.this, Notes.class);
                    intent.putExtra("newnotes", defaultnotes);
                    intent.putExtra("id", iditem);
                    intent.putExtra("text", textitem);
                    startActivity(intent);
                    break;
            }
    
        } catch (Exception E) {
            E.printStackTrace();
        }
    
    }
    
  • 从适配器的列表中删除该项,然后调用
    notifyItemRemoved()

  • @Override
    public void clicked(int clickedposition, View v, int iditem, String textitem) {
        try {
            switch (v.getId()) {
                case R.id.button2:
                    entries = adapter.getnotesentries();// entries of notes in my list
                    int n = db.Dao().delete(entries.get(clickedposition));
                    retrievetasks();
    
                    break;
                case R.id.textView2:
                    Intent intent = new Intent(MainActivity.this, Notes.class);
                    intent.putExtra("newnotes", defaultnotes);
                    intent.putExtra("id", iditem);
                    intent.putExtra("text", textitem);
                    startActivity(intent);
                    break;
            }
    
        } catch (Exception E) {
            E.printStackTrace();
        }
    
    }
    

这两种操作都会混淆适配器,因为它认为您正在从刚刚设置的列表中删除项目(该列表不包含已删除的项目)

因此我最终找到了答案,阻止recycler视图复制数据的解决方案是在每次将数据设置到适配器之前从布局中删除视图。这对我很有效。
@Override
public void clicked(int clickedposition, View v, int iditem, String textitem) {
    try {
        switch (v.getId()) {
            case R.id.button2:
                entries = adapter.getnotesentries();// entries of notes in my list
                int n = db.Dao().delete(entries.get(clickedposition));
                retrievetasks();

                break;
            case R.id.textView2:
                Intent intent = new Intent(MainActivity.this, Notes.class);
                intent.putExtra("newnotes", defaultnotes);
                intent.putExtra("id", iditem);
                intent.putExtra("text", textitem);
                startActivity(intent);
                break;
        }

    } catch (Exception E) {
        E.printStackTrace();
    }

}
例如:

@Override
public void clicked(int clickedposition, View v, int iditem, String textitem) {
    try {
        switch (v.getId()) {
            case R.id.button2:
                entries = adapter.getnotesentries();// entries of notes in my list
                int n = db.Dao().delete(entries.get(clickedposition));
                retrievetasks();

                break;
            case R.id.textView2:
                Intent intent = new Intent(MainActivity.this, Notes.class);
                intent.putExtra("newnotes", defaultnotes);
                intent.putExtra("id", iditem);
                intent.putExtra("text", textitem);
                startActivity(intent);
                break;
        }

    } catch (Exception E) {
        E.printStackTrace();
    }

}
在将数据检索到适配器后,不要忘记调用
notifyDataSetChanged

希望它也能帮助其他人。

要停止复制您的RecyclerView项目,请确保清除您的列表模型,然后获取您的列表模型:

@Override
public void clicked(int clickedposition, View v, int iditem, String textitem) {
    try {
        switch (v.getId()) {
            case R.id.button2:
                entries = adapter.getnotesentries();// entries of notes in my list
                int n = db.Dao().delete(entries.get(clickedposition));
                retrievetasks();

                break;
            case R.id.textView2:
                Intent intent = new Intent(MainActivity.this, Notes.class);
                intent.putExtra("newnotes", defaultnotes);
                intent.putExtra("id", iditem);
                intent.putExtra("text", textitem);
                startActivity(intent);
                break;
        }

    } catch (Exception E) {
        E.printStackTrace();
    }

}
List<myModel> myData = new ArrayList<>();

myData.clear();
List myData=new ArrayList();
myData.clear();

是否使用此行适配器.setdata(db.Dao().loadalltasks());)复制数据?如果在设置数据之前调用adapter.clear()会怎么样?我正在使用上面提到的方法设置适配器,以便在删除任务后刷新数据。我不确定是什么导致了重复。即使我不删除任何任务,在滚动时数据仍然会重复。@JABI按照您在第一点中提到的那样做,因为它不起作用。我使用了notifyitemremoved方法。而且,它在滚动时也会洗牌数据,即使没有任何删除@bwti.e。如果没有使用
单击的
itemremovednotifier
中的代码,似乎有一个
try
子句,异常和洗牌相关吗?我删除了notifyDataSetChanged()方法。即使现在它也不起作用,而且适配器数据也不会反映在Ui中,除非我重新启动应用程序。