2

sqlliteデータベースからデータを取得してリストビューに設定する方法によって、このコードがあります。

Cursor cursor = dbAdapter.getAllIncomingData();
            if (cursor != null && cursor.getCount() > 0) {
                cursor.moveToFirst();
                Log.d("ADD/EDIT", cursor.getCount() + "");

                int size = cursor.getCount();
                incomingDataList = new ArrayList<IncomingData>(size);
                incomingStringList = new ArrayList<String>(size);
                for (int i = 0; i < size; i++) {
                    String serial = cursor.getString(cursor
                            .getColumnIndex("serial"));
                    String mapurl = cursor.getString(cursor
                            .getColumnIndex("mapurl"));
                    String datetime = cursor.getString(cursor
                            .getColumnIndex("datetime"));
                    // Device device=new Device(id, label, serial,
                    // contact);
                    Device dev = dbAdapter.getDeviceBySerial(serial);
                    IncomingData inData = new IncomingData(serial, mapurl,
                            datetime);
                    inData.setLabel(dev.getLabel());
                    inData.setContact(dev.getContact());

                    incomingDataList.add(inData);
                    cursor.moveToNext();
                }
                inAdapter = new IncomingDataArrayAdapter(
                        MatchpointHistoryActivity.this, R.layout.history_item,
                        incomingDataList);
                historyList.setAdapter(inAdapter);


            }

データベースのデータはSMSを受信することで更新されており、レシーバークラスに挿入クエリを記述しました。新しいデータが追加または削除された場合、カーソルに通知が届き、アダプターがリストビューにリセットされます。変更を表示するにはアクティビティを再起動する必要がありますが、変更をすぐに通知する必要があります。私はいつもタイマーを使ってこのようなことをしたくありません、他の方法はありますか?

4

2 に答える 2

10

今、私はあなたの質問を受けました。これはBroadcastReceiverでも実行できますが、今回は独自のカスタムブロードキャストレシーバーになります"com.yourapppackage.DATABASE_CHANGED"。その時点でデータベースにデータを挿入/削除するときはいつでも、このブロードキャストを送信してください。

リストアクティビティ内にカスタムレシーバーを登録し、onReceive()メソッドでリストを更新する必要があります。

例:AndroidManifest.xml内

<receiver
    android:name=".DatabaseChangedReceiver"
    android:enabled="true" >
       <intent-filter>
           <action android:name="com.youapppackage.DATABASE_CHANGED"></action>
       </intent-filter>
</receiver>

DatabaseChangedReceiver.java

public class DatabaseChangedReceiver extends BroadcastReceiver {
    public static String ACTION_DATABASE_CHANGED = "com.youapppackage.DATABASE_CHANGED";

    @Override
    public void onReceive(Context context, Intent intent) {

    }
}

この受信者を登録するアクティビティ、

private DatabaseChangedReceiver mReceiver = new DatabaseChangedReceiver() {
   public void onReceive(Context context, Intent intent) {
       // update your list
   }

}

データベースの挿入/削除メソッド内、注:データベースコード内のコンテキスト参照が必要です。

....
// code to insert/delete
....

context.sendBroadcast(new Intent(DatabaseChangedReceiver.ACTION_DATABASE_CHANGED));

したがって、これにより、DatabaseChangedReceiverをアクティビティに登録したコードが実行されます。

于 2012-08-07T09:18:31.057 に答える
-3

@レイジョン。これにはブールフラグ変数を使用できます。最初はfalseに設定されています。挿入または更新が行われるたびに、フラグをtrueに変更します。その後、フラグがtrueであるかどうかを確認し、notifyDataSetChanged()を実行して、フラグをfalseに設定する必要があります。

于 2012-08-07T08:10:17.240 に答える