【问题标题】:how to make Android ListView refresh如何让Android ListView 刷新
【发布时间】:2013-01-09 05:26:57
【问题描述】:

如果不重新启动整个应用程序,我目前无法从我的 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);

【问题讨论】:

  • 您的代码中的dataStore.COLUMN_NAME_SITE 是什么?以及如何添加//更新/删除项目?我认为您的问题是因为您同时使用了 getReadableDatabase 和 getWriteableDatabase 方法。
  • 请先将与数据库相关的代码放在与活动类不同的类中

标签: android listview refresh onresume


【解决方案1】:

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

【讨论】:

  • 与活动无关。很明显,主要问题是数据的同步。
  • 嗯,我看到他正在使用 startActivity 调用 updateDeleteLoginInfo。由此,我假设这是他用来更新/删除信息的活动的名称,并且由于他没有阻止当前活动,因此不会反映对列表的任何更改。我有类似的代码并且有类似的问题,这就是我回答他的原因。
  • @DigCamera 他使用 startActivity 方法就足够了。如果将数据存储在所有活动都可以访问的全局对象中,它的工作原理与 startActivityForResult 相同。 SQLite 数据库就是这种对象的一个​​很好的例子,尽管它比一些内存中的 ArrayList 更难使用。
  • @vorrtex 我看到它的方式是: 1. 他填充 ListView 2. 他调用 Activity 3. 他从 Activity 返回时认为应该重新填充列表。 ListView(据我所知)没有以任何方式直接链接到查询。因此,它不会刷新。如果他为结果调用 Activity,他将能够通过简单的 notifyDataSetChanged() 调用来刷新数据。
【解决方案2】:

startManagingCursor 已弃用。 请改用CursorLoader

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

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-08
      相关资源
      最近更新 更多