将数据从对话框插入 SQLi 后自定义列表视图不刷新

Posted

技术标签:

【中文标题】将数据从对话框插入 SQLi 后自定义列表视图不刷新【英文标题】:Custom listview not refresh after insert data from dialog to SQLi 【发布时间】:2019-02-17 21:01:39 【问题描述】:

我从这样的对话框向 SQLi 插入数据

 builder.setPositiveButton("OK", new DialogInterface.OnClickListener() 
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) 
                        ContentValues cv = new ContentValues();
                        cv.put(DBHelper.COL_VEHICLE_TYPE, 1);
                        cv.put(DBHelper.COL_OPTION_NAME, "driver");
                        cv.put(DBHelper.COL_DATE, mDisplayDate.getText().toString());

                        db.insert(DBHelper.TABLE_NAME, null, cv);
                        cursor.requery();
                        adapter.notifyDataSetChanged();

                    
                );

我在函数 onResume() 中查询数据以显示在这样的列表视图中。

public void onResume() 

    super.onResume();

    lst_driver.clear();

    db = dbHelper.getWritableDatabase();
    String[] queryColumns = new String[]"_id", DBHelper.COL_VEHICLE_TYPE, DBHelper.COL_OPTION_NAME,DBHelper.COL_DATE ;
    cursor = db.query(DBHelper.TABLE_NAME, queryColumns, null,null,
           null,null,null);

    HashMap<String,String> map ;
    String vh_name;

    while(cursor.moveToNext())
    
        map = new HashMap<String,String>();

        vh_name= dbHelper.VehicleType(cursor.getString(1));
        map.put("vehicle_type", vh_name);
        map.put("date", cursor.getString(3));
        lst_driver.add(map);


    

    String[] showColumns = new String[]"vehicle_type", "date";
    int[] views = new int[] R.id.ColType, R.id.ColDate;

    adapter = new SimpleAdapter(DriverLicenseActivity.this,lst_driver, R.layout.activity_list_layout, showColumns, views);
    lv_driver.setAdapter(adapter);

    adapter.notifyDataSetChanged();


插入数据后,它不会显示在列表视图中。我必须再次打开此活动,然后它将出现在列表视图中。插入 SQLi 后如何在列表视图中显示数据?

【问题讨论】:

ArrayList 中添加项目后,您是否使用过notifyDataChanged() 也添加你的 Adapter 首先检查是否调用了 resume 方法?并发布适配器 【参考方案1】:

您可以在一个功能中创建数据获取,然后在从onClickonResume() 插入数据后调用它

private void getData() 

  lst_driver.clear();

  db = dbHelper.getWritableDatabase();
  String[] queryColumns = new String[]"_id", DBHelper.COL_VEHICLE_TYPE, DBHelper.COL_OPTION_NAME,DBHelper.COL_DATE ;
  cursor = db.query(DBHelper.TABLE_NAME, queryColumns, null,null,
       null,null,null);

  HashMap<String,String> map ;
  String vh_name;

  while(cursor.moveToNext())
  
    map = new HashMap<String,String>();

    vh_name= dbHelper.VehicleType(cursor.getString(1));
    map.put("vehicle_type", vh_name);
    map.put("date", cursor.getString(3));
    lst_driver.add(map);


  

  String[] showColumns = new String[]"vehicle_type", "date";
  int[] views = new int[] R.id.ColType, R.id.ColDate;

  adapter = new SimpleAdapter(DriverLicenseActivity.this,lst_driver, R.layout.activity_list_layout, showColumns, views);
  lv_driver.setAdapter(adapter);

  adapter.notifyDataSetChanged();

然后在您的onResume 上调用它,并在您从onClickListener 插入数据之后:

public void onResume() 
  getData();


builder.setPositiveButton("OK", new DialogInterface.OnClickListener() 
                @Override
                public void onClick(DialogInterface dialogInterface, int i) 
                    ContentValues cv = new ContentValues();
                    cv.put(DBHelper.COL_VEHICLE_TYPE, 1);
                    cv.put(DBHelper.COL_OPTION_NAME, "driver");
                    cv.put(DBHelper.COL_DATE, mDisplayDate.getText().toString());

                    db.insert(DBHelper.TABLE_NAME, null, cv);
                    cursor.requery();
                    getData();

                
            );

【讨论】:

【参考方案2】:

您的 onResume 方法似乎在 SQLite 插入之前被调用。我建议您将更新适配器的部分分开,并在插入后立即调用此方法。

【讨论】:

以上是关于将数据从对话框插入 SQLi 后自定义列表视图不刷新的主要内容,如果未能解决你的问题,请参考以下文章

使用 UISearchbar 和过滤后自定义新表

如何从列表视图按钮单击将多个数据添加到数组列表?

将项目从对话框添加到 ListView

交换列表中的项目后自定义列表适配器和 ViewHolder 模式出现问题

ListView 从 EditText 更新

在android中使用自定义列表视图时无法设置左右对话