2

データベースを使用していて、カーソルアダプタを使用してローダー内のデータベースを照会すると、リストフラグメントがあります。 ユーザーがリストビューアイテムを長く押すと、コンテキストメニューが表示され、このエントリを削除するオプションが表示されます。 deleteを押すと、このエントリを削除するスレッドを開始してから、ローダーを再起動して新しいカーソルを取得します(「requery()」は非推奨です)。 ローダーが新しいカーソルを読み込むのを終えたときに、リストビューをリフレッシュすると思われるchangeCursorメソッドを使用しようとしていますが、それはしません。したがって、notifyDataSetChangedを試しましたが、それも機能しません。 私はチェックして、カーソルがローダーから戻ってきてカーソルを変更しますが、リストビューは更新されません。アダプタでchangeCursor()を使用した後にリストビューが更新されない

どうすればよいですか?フラグメントを再起動しますか?ここで

は、いくつかのコードです:

case MENU_REMOVE: 
      final AdapterContextMenuInfo info = (AdapterContextMenuInfo)item.getMenuInfo(); 
      mProgress = ProgressDialog.show(getActivity(), getString(R.string.list_remove_progress_title_text), 
        getString(R.string.progress_dialog_description)); 
      new Thread(new Runnable() { 

       @Override 
       public void run() { 
        PlacesHandler wph = new PlacesHandler(getActivity()); 
        wph.DeleteEntry(mPlaceName, info.id); 
        getLoaderManager().initLoader(0, null, ListFragment.this); 
       } 
      }).start(); 
      return(true); 

読み込みが終了したら:

@Override 
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 
     if(mProgress == null || !mProgress.isShowing()){ 
      ... 
     } 
     else{ 
      mProgress.dismiss(); 
      mAdapter.changeCursor(data); 
      mAdapter.notifyDataSetChanged(); 
     } 
    } 

感謝を!

+0

カーソルを更新するには 'cursor.requery()'を呼び出していますか? –

+0

いいえ、カーソル。これはドキュメントに書かれているので、私はchangeCursor()を使用しています。 – Elad92

答えて

3

おかげで誰もが私の問題を見つけました! ローダーから返されたカーソルは、アダプターのカーソルと同じカーソルでした。

getLoaderManager().initLoader(0, null, this); 

の代わりに:フラグメントが作成されたとき、私は最初にカーソルをロードしたとき、私はすでにID 0でローダーを使用しましたのでので

getLoaderManager().restartLoader(0, null, this); 

それは、私が呼ばれるので ですちょうど私にすぐにカーソルを返しました。 したがって、同じ問題に直面して読んでいる人がいる場合は、initLoaderは、指定されたIDを持つ既存のローダを使用していることがわかります。存在しない場合は作成します。 ローダーの古いデータを破棄してやり直す場合は、restartLoaderを使用してください。

もう一度、お手伝いしてくださった皆様に感謝します!

0

何かのもの。私は断片に精通していないので、私はあなたを助けようとします。

ここで、カーソルを更新して新しいデータをフェッチしますか?また、AsyncTaskを使用して削除を試みてください。終了したら、postexecuteメソッドでアダプタを更新します。

+0

あなたが見ることができるようにスレッド内で削除自体が行われました。これはあまりにも複雑な作業ではないので、AsyncTaskを実装する代わりにスレッドで行うことをお勧めします。新しいカーソルのロードは、AsyncTaskのようなローダーで行われています。 'onLoadFinished'コールバックはAsyncTaskのpostexecuteに似ています。 – Elad92

0

私は新しいcursonと新しいアダプタを作成することによって同様の問題を解決しました。リストビューに新しいアダプタを設定する: myListView.setAdapter(listViewAdapter);

このアプローチのonyの問題は、私のリストビューがスクロール位置を保持しないということです。

+1

それは私のためには機能しません、あなたのコードをここに追加してください。 – Elad92

1

SQLiteのレジスタを削除した後、私は単純に、このやった:

myAdapter.getFilterを()( "")フィルタ;。

+0

それは私のための解決策だが、私はフィルタを指定しなかった...なぜアンドロイドか – Pascalius

関連する問題