1

如果不重新启动整个应用程序,我目前无法从我的 ListView 查看新插入的 sqlite 数据。目前,当一个 ListView 项目被选中时,一个新的活动开始显示详细信息。一旦详细信息被更新、编辑或项目被删除,ListView 将再次显示,但包含所有原始数据,除非应用程序关闭并重新启动。列表视图 OnResume 方法如下。当 ListView 显示在屏幕上时,如何刷新它。我尝试添加 .notifyDataSetChanged 没有成功。不确定我是否正确实施了它。

    public List<String> populateList (){

List<String> webNameList = new ArrayList<String>();

dataStore openHelperClass = new dataStore (this);

SQLiteDatabase sqliteDatabase = openHelperClass.getReadableDatabase();

Cursor cursor = sqliteDatabase.query(dataStore.TABLE_NAME_INFOTABLE, null, null, null,  null, null, dataStore.COLUMN_NAME_SITE, null);

startManagingCursor(cursor);

while (cursor.moveToNext()){

String sName = cursor.getString(cursor.getColumnIndex(dataStore.COLUMN_NAME_SITE));
String wUrl = cursor.getString(cursor.getColumnIndex(dataStore.COLUMN_NAME_ADDRESS));
String uName = cursor.getString(cursor.getColumnIndex(dataStore.COLUMN_NAME_USERNAME));
String pWord = cursor.getString(cursor.getColumnIndex(dataStore.COLUMN_NAME_PASSWORD));
String lNotes = cursor.getString(cursor.getColumnIndex(dataStore.COLUMN_NAME_NOTES));

LoginDetails lpDetails = new LoginDetails();

    lpDetails.setsName(sName);
    lpDetails.setwUrl(wUrl);
    lpDetails.setuName(uName);
    lpDetails.setpWord(pWord);
    lpDetails.setlNotes(lNotes);

    loginArrayList.add(lpDetails);
    webNameList.add(sName);
 }

   sqliteDatabase.close();
   return webNameList;
 }



  @Override
   protected void onResume() {
   super.onResume();
   loginListAdapter = new ArrayAdapter<String>(this,        android.R.layout.simple_list_item_1, populateList());
    loginList.setAdapter(loginListAdapter);
 }

  @Override
   public void onItemClick(AdapterView<?> arg0 , View arg1, int arg2, long arg3) {
   Toast.makeText(getApplicationContext(), "Selected ID :" + arg2,     Toast.LENGTH_SHORT).show();

Intent updateDeleteLoginInfo = new Intent (this, UpdateDeleteLoginList.class);

LoginDetails clickedObject = loginArrayList.get(arg2);

    Bundle loginBundle = new Bundle();
loginBundle.putString("clickedWebSite",clickedObject.getsName());
loginBundle.putString("clickedWebAddress",clickedObject.getwUrl());
loginBundle.putString("clickedUserName",clickedObject.getuName());
loginBundle.putString("clickedPassWord",clickedObject.getpWord());
loginBundle.putString("clickedNotes",clickedObject.getlNotes());

updateDeleteLoginInfo.putExtras(loginBundle);

startActivity(updateDeleteLoginInfo);
4

3 回答 3

0

您正在使用 startActivity。你为什么不改用 startActivityForResult 呢?这个问题的答案详细说明了如何调用第二个活动。一旦它返回,您将不得不使用 notifyDataSetChanged() 调用。

于 2013-01-08T20:22:08.277 回答
0

startManagingCursor已弃用。请改用CursorLoader

当 ContentProvider 的数据发生变化时,使用和更新 ListView 中的数据非常简单。

这是一个很好的例子: http ://www.vogella.com/articles/AndroidSQLite/article.html#todo_activities

于 2013-01-08T21:06:16.287 回答
0

您只显示了应用程序代码的一部分,所以我在这里可能有点离谱,但看起来您正在使用 Cursor 返回一个 List 并使用 List 创建一个 ArrayAdapter ...

如果您希望数据是“新鲜的”,为什么不将 CursorLoader 与 LoaderManager 一起使用?LoaderManager 有几个好处(比如将查询从 UI 线程中移出),并且在监视数据库的更改时,LoaderManager 为您完成了一些繁重的工作。

有一篇博文我觉得很有帮助 - http://www.androiddesignpatterns.com/2012/07/understanding-loadermanager.html

于 2013-01-08T21:10:52.427 回答