我有这个代码,我可以从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);
}
通过接收短信正在更新数据库的数据,我已经在接收器类中编写了插入查询,现在我希望如果添加或删除新数据,则会通知游标并将适配器重置为列表视图,我必须重新启动活动以查看更改,但我需要立即通知更改。我不想一直使用计时器来做这些事情,还有其他办法吗?
答案 0 :(得分: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的代码。
答案 1 :(得分:-3)
@Reyjohn。 您可以使用布尔标志变量。最初它设置为 false 每当插入或任何更新完成后,将标志更改为 true 。然后你可以简单地检查flag是否 true 然后你必须通知notifyDataSetChanged()并再次将标志设置为 false 。