java - 如何阻止 Recyclerview 产生重复项并停止洗牌?
问题描述
我是这里的新手,我正在开发一个笔记应用程序。我注意到我在 recyclerview 中的笔记在滚动时会被重复和打乱位置。我花了很多时间更改和修改代码,但没有运气。希望你们通过代码。谢谢您的时间。
**相关的适配器代码是**
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());
}
}
}
这就是我在主要活动中实现 onclick 方法的方式
@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()
insetData()
)。从适配器列表中删除该项目,然后调用
notifyItemRemoved()
这样做会使适配器感到困惑,因为它认为您正在从刚刚设置的列表中删除项目(其中不包含已删除的项目)
推荐阅读
- c# - 在新窗口中重新打开“ChartJS”图表(VS、C#、ChartJS)
- amazon-web-services - 我需要通过 SSH 提供我的 AWS EC2 实例的详细信息
- c++ - 在 for 循环中使用逗号
- ruby-on-rails - Rails:权限被拒绝 - “127.0.0.1”端口 3000 的绑定(2)(Errno::EACCES)
- python - Django:如何将每个应用程序记录到单独的文件中
- json - 使用beautifulsoup python抓取时解析div中的json对象
- crystal-reports - Crystal Reports - 创建日历
- ios - 如何使用 TypedRowControllerType 在 Eureka 4.3 中创建自定义演示者行?
- r - R:data.table 在实际存在时返回一个空行
- java - 设置 HorizontalAlignment 不能完全右对齐 PageXofYBuilder