2012-03-13 8 views
1

私の最初のAndroidアプリの完成に近いですが、私のアプリでListViewを供給するSQLite DBからアイテムを削除すると奇妙なバグで戦っています。アイテムが削除され、ListViewから離れて戻ってきた場合は更新されますが、リストが更新されるまでリストは更新されません。notifyDataSetChanged()を呼び出すとListViewが更新されないのはなぜですか?

私はここに問題のクラスのほとんどを掲載しました:https://gist.github.com/2025973が、ここでは、関連するコールバックは、ファイル内の行56で始めている:

builder.setPositiveButton(R.string.button_delete, 
    new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int which) { 
      databaseConnector.deleteSimpleDie(arg3); 
      storedDiceAdapter.notifyDataSetChanged(); 
     } 
    }); 

は、私がここで間違って何をしているのですか?私はそれが何か簡単だと確信しています。私はもともと非同期で削除を行っていましたが、notifyDataSetChanged()を呼び出すことができませんでした。なぜなら、Cursorを作成したスレッドから発生する必要があったからです。

UPDATE

さて、これはかなりゲットー(私は...と思う)ですが、私はそれが最終的には、作業を持っています。誰かがこれがどんなにひどく間違っているのか教えてくれませんか?基本的には、コールバック内でCursorAdapter全体を再インスタンス化しています。それは問題を解決するが、それは私が気づいていないいくつかの負の副作用があると思う。

builder.setPositiveButton(R.string.button_delete, 
    new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int which) { 
      databaseConnector.deleteSimpleDie(arg3); 

      String[] from = new String[] { "name", "description" }; 
      int[] to = new int[] { R.id.dice_name, R.id.dice_description }; 

      storedDiceAdapter = new SimpleCursorAdapter(StoredDice.this, 
        R.layout.stored_dice_item, null, from, to); 
       setListAdapter(storedDiceAdapter); 
     } 
    }); 
+0

http://stackoverflow.com/questions/7019517/unable-to-get-listview-to-refresh-from-database/7020582#7020582 –

+0

私はそれを見て、それが何を持っているかはっきりしていません私の問題。私は同じ基本的な問題を見るが、実際には解決されているとは思えない。彼の最後のコメントは、まだListViewを更新していないということです。 – Utoxin

+0

あなたはどのようなアダプターを使用していますか? – josephus

答えて

0

さて、質問の更新ごとに、それが動作しているようです。その解決策には驚かないが、それは私の直面する問題を解決した。皆さん、助けていただきありがとうございます。

0

notifyDataSetChanged後listView.invalidateを()追加してみてください()

+0

運がありません。これを他の答えと一緒に、変化なしで試してみました。 – Utoxin

0

私はあなたの問題は、ダイアログだと思う:

public void onClick(DialogInterface dialog, int which) { 
         databaseConnector.deleteSimpleDie(arg3); 
         storedDiceAdapter.notifyDataSetChanged(); 
        } 

ダイアログを表示するとき、あなたの活動がまたはonStopになります今度はアクティビティがリフレッシュされないので、提案:do notifyDataSetChangedが終了したら、onResumeメソッドも呼び出すとダイアログを閉じることができますnotifyDataSetChanged

+0

運がない。これを他の答えと一緒に、変化なしで試してみました。ダイアログボックスがフルスクリーンの場合、 'onStop'の – Utoxin

+0

、' storedDiceAdapter.changeCursor(null); '、' onStop'が呼び出され、ダイアログ表示時にカーソルがヌルに変更され、notifydatachanged更新がない場合は、アクティビティの 'onResume'メソッドが呼び出され、' GetSimpleDiceTask.onPostExecute'が実行されたことを確認してください。 – idiottiger

+0

ダイアログはポップアップで、フルスクリーンではありません。これらのメソッドが実行されているかどうかを確認するために、私はノブを公開し、その確認方法は不明です。 EclipseのLogCatタブでメッセージをポップアップできる方法はありますか? – Utoxin

0

私は以前同様の問題に遭遇しましたが、正確に同じかどうかはわかりません。 あなたはそれを試すことができます。

  1. BaseAdapterを継承するアダプタクラスまたは必要に応じてアダプタを継承するアダプタクラスを作成します。
  2. setNewData(List)などのパブリックメソッドを作成して内部リストを更新します。
  3. 変更があった場合は、notifyDataSetChanged()を呼び出す前に内部リストを更新してください。

私の場合は機能します。あなたのコードに

若干の変更:

builder.setPositiveButton(R.string.button_delete, 
new DialogInterface.OnClickListener() { 
    public void onClick(DialogInterface dialog, int which) { 
     databaseConnector.deleteSimpleDie(arg3); // Update DB 
     storedDiceAdapter.setNewData(listData); // Update internal list 
     storedDiceAdapter.notifyDataSetChanged(); // Notify changes 
    } 
}); 
+0

listDataとは何ですか、そしてそれはどこで宣言されるべきですか? – Utoxin

+0

これは何でもかまいませんが、アダプターにリストされているものによって異なります。リスト、リストなど – Calvin

2

基本データセットを新しいものに設定したことがある場合は、アダプタが保持している参照が破損します。たとえば、これはアダプタを破る:あなたは完全にあなたのデータセットを変更したい場合は

Globals.diceList = newDiceList; 

、あなたは常に再ツールアダプタに持つの手間を省くれる、もう少しこのような何かを試してみてください。あなたのケースでは、あなたの代わりに、単純な「削除」オプションを使用する必要がありますが

Globals.diceList.clear(); 
    Globals.diceList.addAll(newDiceList); 

。これにより、参照されている場所を変更することなく、リストの内容が変更されます。 (Javaはそれほど奇妙です。)

私はこれをさらに詳しく見て、hereと書いています。

関連する問題