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

startManagingCursorは非推奨になりました。代わりにCursorLoaderを使用してください。

ContentProviderのデータが変更されるとすぐに、ListViewのデータを使用および更新するのは非常に簡単です。

これが良い例です: http ://www.vogella.com/articles/AndroidSQLite/article.html#todo_activities

于 2013-01-08T21:06:16.287 に答える
0

あなたはアプリコードの一部しか表示していないので、ここではオフベースかもしれませんが、カーソルを使用してリストを返し、リストを使用してArrayAdapterを作成しているようです...

データを「新鮮」にしたい場合は、LoaderManager で CursorLoader を使用してみませんか? LoaderManager には (クエリを UI スレッドから移動するなど) いくつかの利点があり、DB の変更を監視する際には、LoaderManager が少し手間のかかる作業を行います。

非常に役立つブログ投稿があります - http://www.androiddesignpatterns.com/2012/07/understanding-loadermanager.html

于 2013-01-08T21:10:52.427 に答える
0

startActivity を使用しています。代わりに startActivityForResult を使用しないのはなぜですか? この質問への回答では、2 番目のアクティビティを呼び出す方法について詳しく説明しています。返されたら、notifyDataSetChanged() 呼び出しを使用する必要があります。

于 2013-01-08T20:22:08.277 に答える