Java Android RecyclerView未在适配器上刷新。notifyDataSetChanged

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&

这里的经典问题是:我使用自定义对象的ArrayList将一些数据从数据库中提取到RecycleView中(这发生在片段中,而不是在主活动中)。在我尝试使用微调器刷新recyclerView以改变数据的排序方式之前,一切都像一个魔咒。我知道数据被正确地输入了recyclerView。我做错了什么?API级别为19

以下是获取的方式:

    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();
}