Java Android RecyclerView未在适配器上刷新。notifyDataSetChanged
这里的经典问题是:我使用自定义对象的ArrayList将一些数据从数据库中提取到RecycleView中(这发生在片段中,而不是在主活动中)。在我尝试使用微调器刷新recyclerView以改变数据的排序方式之前,一切都像一个魔咒。我知道数据被正确地输入了recyclerView。我做错了什么?API级别为19 以下是获取的方式:Java Android RecyclerView未在适配器上刷新。notifyDataSetChanged,java,android,android-recyclerview,Java,Android,Android Recyclerview,这里的经典问题是:我使用自定义对象的ArrayList将一些数据从数据库中提取到RecycleView中(这发生在片段中,而不是在主活动中)。在我尝试使用微调器刷新recyclerView以改变数据的排序方式之前,一切都像一个魔咒。我知道数据被正确地输入了recyclerView。我做错了什么?API级别为19 以下是获取的方式: public ArrayList<LEGOSet> getSets(String conditions) { ArrayList&
public ArrayList<LEGOSet> getSets(String conditions) {
ArrayList<LEGOSet> sets = new ArrayList<>();
Cursor cursor = database.rawQuery("SELECT * FROM Sets " + conditions, null);
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
LEGOSet set = new LEGOSet(cursor.getInt(0), cursor.getString(1), cursor.getInt(2), cursor.getInt(3), cursor.getString(4), cursor.getDouble(5),
cursor.getDouble(6), cursor.getDouble(7), cursor.getDouble(8), cursor.getDouble(9), cursor.getDouble(10), cursor.getString(11),
cursor.getString(12), cursor.getString(13), cursor.getString(14), cursor.getInt(15), cursor.getInt(16), cursor.getInt(17));
sets.add(set);
cursor.moveToNext();
}
cursor.close();
return sets;
}
但这似乎并不正确。我应该能够用新数据刷新现有适配器,而不是创建一个全新的适配器,对吗?这是许多开发人员经常面临的一个经典问题 快速修复: 替换
sets = dbManager.getSets("order by pieces desc");
与
升序也是如此
说明:
初始化适配器时,将传递其实例由适配器存储的Arraylist。调用notifyDataSetChanged()时,适配器将读取实例并根据新的ArrayList刷新布局。但是,当您使用sets=dbManager.getSets(“order by pieces desc”)重新初始化ArrayList时代码>,适配器将丢失对新列表的引用,并且无法刷新布局。这可以通过保持实例不变并替换使用clear()
和addAll(list)
完成的值来解决
请随时询问评论中的任何疑问,如果我能够解决您的问题,请将此答案标记为正确。这是许多开发人员经常面临的经典问题
快速修复:
替换
sets = dbManager.getSets("order by pieces desc");
与
升序也是如此
说明:
初始化适配器时,将传递其实例由适配器存储的Arraylist。调用notifyDataSetChanged()时,适配器将读取实例并根据新的ArrayList刷新布局。但是,当您使用sets=dbManager.getSets(“order by pieces desc”)重新初始化ArrayList时代码>,适配器将丢失对新列表的引用,并且无法刷新布局。这可以通过保持实例不变并替换使用clear()
和addAll(list)
完成的值来解决
请随时询问评论中的任何疑问,如果我能够解决您的问题,请将此答案标记为正确。在适配器内类
创建方法:
setData(ArrayList<LEGOSet> sets) { // new list here
this.sets = sets; // assing ArrayList from database to your list which is inside adapter class
notifyDataSetChanged();
}
setData(ArrayList集合){//这里是新列表
this.sets=sets;//将ArrayList从数据库分配到适配器类内的列表
notifyDataSetChanged();
}
然后只需将适配器内的adapter.notifyDataSetChanged()
替换为adapter.setData(set)
即可创建方法:
setData(ArrayList<LEGOSet> sets) { // new list here
this.sets = sets; // assing ArrayList from database to your list which is inside adapter class
notifyDataSetChanged();
}
setData(ArrayList集合){//这里是新列表
this.sets=sets;//将ArrayList从数据库分配到适配器类内的列表
notifyDataSetChanged();
}
然后只需将适配器.notifyDataSetChanged()
替换为适配器.setData(sets)
就可以了!谢谢你,这样一个简单的错误就结束了!很好用!谢谢你,这样一个简单的错误就结束了!
setData(ArrayList<LEGOSet> sets) { // new list here
this.sets = sets; // assing ArrayList from database to your list which is inside adapter class
notifyDataSetChanged();
}