您好我有一个应用程序,在登录后,加载一个主活动,其中包含一个包含3个包含listviews的选项卡的tabhost。每个选项卡都通过sqlite +自定义适配器填充。数据库最初通过xml数据填充(异步同步到sqlite数据库)。
我的问题:我想允许允许手动同步sqlite数据库和XML数据,然后更新当前选项卡列表视图。我让异步线程正常工作来进行数据库的后台更新。我无法弄清楚的是如何强制刷新当前选项卡的列表视图。问题是我不知道如何从父活动访问tabhost中的子活动。
我很确定notifyDataSetChanged()是我需要的但我无法弄清楚如何访问标签的活动>适配器来做到这一点。如何访问子活动适配器以调用notifyDataSetChanged()?父(包含)活动有一个按钮,用于刷新tabhost的列表视图。
另一种选择:我可以尝试从后台线程的onPostExecute()回调中广播一个意图。即,当它完成使用xml数据更新数据库时,我的标签接收广播并通过notifyDataSetChanged()触发它进行刷新...但这可能不是广播/接收意图的设计是如何正确的?即,在活动和包含标签的列表视图活动之间进行通信?
这是关于堆栈溢出的第二篇帖子我希望我的解释清楚。感谢您提供的任何帮助或建议
编辑(2012年1月16日): 自从我在这个问题上工作了很长时间。我最初使用广播意图并在儿童活动中消费它的解决方案。但是我已经接受了许多其他人的建议(你也应该这样做)!而是停止使用选项卡内的活动。我现在正在使用选项卡中的视图。这工作得更好,更清洁。
除了代码变得过于繁琐之外,当在纵向/横向上旋转偏差时,在活动之间进行时,我也变得奇怪的“数据库未关闭”类型错误。选项卡内的视图而不是活动修复了许多问题,我确信它在资源使用方面更好。
答案 0 :(得分:2)
我刚刚完成了“a”解决方案。我基本上采用了上面提到的广播意图替代方案。
在我的AsyncTask任务的onPostExecute()方法中(包括我的XML与数据库的后台同步),让其他人想要这样做。我用:
提出了一个意图广播 @Override
protected void onPostExecute(Integer result) {
Intent i = new Intent("com.myapp.app.DATA_REFRESH");
sendBroadcast(i);
}
然后在tabhost>中标签活动我收到广播的意图:
public class updaterBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
fillData(); // rebuild my listview with new database data
}
}
使用以下命令注册/设置上述意图接收器:
@Override
public void onResume(){
IntentFilter filter = new IntentFilter("com.myapp.app.DATA_REFRESH");
updaterBroadcastReceiver r = new updaterBroadcastReceiver();
registerReceiver(r,filter);
super.onResume();
}
FillData()用于使用数据库中的新数据更新列表视图。
这对我来说似乎有用,如果有人建议更好的方法,请告诉我。我对android很新。
干杯, 罗布
答案 1 :(得分:1)
查看this主题。
我遇到类似的问题,我想刷新TabHost事件的标签。我定义了一个接口,我的所有Sub(Tab)活动都实现了,并从TabHost中调用Sub(Tab)Activity的消息(查看发布的onTouch()
方法)。
答案 2 :(得分:-1)
请看这篇文章:
特别是这一行 tableRowAdapter.notifyDataSetChanged();
的问候, 的Matthias