3

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

私は何をすべきか?フラグメントを再起動しますか?

ここにいくつかのコードがあります:

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();
        }
    }

ありがとう!

4

4 に答える 4

4

みんなありがとう、でも問題が見つかりました!ローダーから返されたカーソルは、アダプターにあったカーソルと同じカーソルでした。これは私が電話したからです:

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

それ以外の:

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

したがって、フラグメントの作成時に最初にカーソルをロードしたときにID 0のローダーをすでに使用しているため、カーソルがすぐに返されます。initLoaderしたがって、同じ問題に直面してそれを読んでいる人がいる場合は、指定されたIDを持つ既存のローダーがあればそれを使用することを知っておいてください。ない場合は作成します。ただし、ローダーの古いデータを破棄して最初からやり直す場合は、を使用する必要がありますrestartLoader

繰り返しになりますが、助けようとした人に感謝します!

于 2012-02-14T20:53:48.573 に答える
1

SQLiteレジスタを削除した後、私は単にこれを行いました:

myAdapter.getFilter()。filter( "");

于 2013-03-14T03:50:12.130 に答える
0

いくつかのこと。私はフラグメントに精通していないので、あなたを助けようとします。

新しいデータをフェッチするためにカーソルをどこで更新していますか?また、AsyncTaskを使用して削除してみてください。完了したら、実行後のメソッドでアダプターを更新します。

于 2012-02-13T22:07:33.413 に答える
0

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

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

于 2012-02-14T12:01:32.070 に答える