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


            }

数据库的数据正在通过接收短信更新,我已经在接收器类中编写了插入查询,现在我希望如果添加或删除新数据,那么光标将得到通知并将适配器重置为列表视图,我必须重新启动活动才能查看更改,但我需要立即通知更改。我不想一直用计时器来做这些事情,还有其他方法吗?

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。之后,您可以简单地检查 flag 是否为true,然后您必须 notifyDataSetChanged() 并再次将 flag 设置为false

于 2012-08-07T08:10:17.240 回答