【问题标题】:data loaded from SQLitE databse is not saving in the model class ArrayList android从 SQLite 数据库加载的数据未保存在模型类 ArrayList android 中
【发布时间】:2021-09-04 09:34:15
【问题描述】:

我正在从我的SQLite database 中检索数据。我检查了我的数据是否已成功检索,但这并没有通过记录值保存在我的 Model Class 的 ArrayList 中。

然后我记录了我的AdptergetItemCount() 方法的list. size() 的值为0。所以为什么我的数据没有保存在模型类中。

ReadSqliteData() 方法

public void ReadSqliteData(Context context){
ArrayList<Model> list = new ArrayList<>();
Adpter adpter = new Adpter(list,context);
SQLiteDatabase database = getWritableDatabase();
Cursor cursor = database.rawQuery("Select name, image from orders",null);
while (cursor.moveToNext()){
    Model model = new Model();
    model.setImage(cursor.getString(0));            
    model.setName(cursor.getString(1));    
    list.add(model);
}
adpter.notifyDataSetChanged();
cursor.close();
database.close();
}

我的适配器类中的这个方法

@Override
    public int getItemCount() {
        Log.d("tag",String.valueOf(list.size())); /// i am getting this value 0
        return list.size();
    }

我也尝试过放置构造函数。但这也行不通。

模型.java

如果适配器代码需要下面的注释

【问题讨论】:

    标签: android sqlite android-recyclerview android-sqlite pojo


    【解决方案1】:

    试试下面的代码。

     class Adapter extends RecyclerView.Adatper<RecyclerViewAdapter.RecyclerViewHolder>(){
     //add new method in adapter class
     Public void dataChange(ArrayList<Model> itemList){
      //update your previous list with the new list
      previousList = itemList;
      notifyDataSetChanged()
      }
    
    }
    
    
    public void ReadSqliteData(Context context){
    ArrayList<Model> list = new ArrayList<>();
    Adpter adpter = new Adpter(list,context);
    SQLiteDatabase database = getWritableDatabase();
    Cursor cursor = database.rawQuery("Select name, image from orders",null);
    while (cursor.moveToNext()){
    Model model = new Model();
    model.setImage(cursor.getString(0));            
    model.setName(cursor.getString(1));    
    list.add(model);
    }
    //call adapter dataChange() method from here
    adpter.dataChange(list);
    cursor.close();
    database.close();
    }
    

    【讨论】:

    • 这种方法有什么问题。我以前在使用 Firebase 时总是使用这种方法。
    • 您的适配器在调用 notifyDataSetChanged() 时没有获得最新的项目列表
    • 我在这个方法中创建了一个新的 'ArrayList' 和 'Adapter'。而我必须将这些传递给我将layoutmanageradapter 设置为recyclerview 的活动。那么这种方法是正确的。请检查并支持我的回答。stackoverflow.com/a/68055662/15622565
    • 通知recyclerview更新数据的问题仍未解决?
    • 您的方法不正确,因为每次您将在数据更改时创建一个新的适配器实例,每次迭代都应该使用相同的实例
    【解决方案2】:

    从适配器类中,创建公共函数来设置新项目

    // Adapter Class
    public void setItems(List<Model> newItems) {
        this.list = newItems;      <-- Here you need to replace with new items
        notifyDataSetChanged();
    }
    
    public int getItemsCount() {
        return list.size();
    }
    

    来自您的活动adapter.setItems(newItems);

    【讨论】:

      【解决方案3】:

      发生这种情况是因为我为 ArrayListAdpter 使用了不同的变量。 只需将ArrayListAdpter作为参数传递给ReadSqliteData()方法,用于将LayoutManagerAdpter设置为RecyclerView,问题就解决了。,

      ReadSqliteData(Context context, ArrayList list,Adpter adpter){ //这里的代码 }

      public void ReadSqliteData(Context context, ArrayList<Model> list,Adpter adpter){
      SQLiteDatabase database = getWritableDatabase();
      Cursor cursor = database.rawQuery("Select name, image from orders",null);
      Model model = new Model();
      while (cursor.moveToNext()){
      model.setImage(cursor.getString(0));            
      model.setName(cursor.getString(1));    
      list.add(model);
      }
      adpter.notifyDataSetChanged();
      cursor.close();
      database.close();
      }
      

      注意:- 只有我作为参数传递的`列表和适配器用于将布局管理器和适配器设置为我的 Activity 类中的回收器视图

      【讨论】:

        猜你喜欢
        • 2011-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-19
        • 1970-01-01
        • 1970-01-01
        • 2010-09-14
        相关资源
        最近更新 更多