【问题标题】:How do I get adapter to update views after data changes when using fragments?使用片段时如何让适配器在数据更改后更新视图?
【发布时间】:2013-04-25 01:37:20
【问题描述】:

我在一个片段中有一份订单列表。在第二个片段中,我显示订单的详细信息,并使用第三个片段显示更改订单状态的按钮。

在列表中,每个订单都以背景颜色显示,指示其状态,例如绿色表示已完成交货。

在横向模式下,详细信息和列表都会显示。在纵向模式下,我使用两个单独的活动。

这一切都很好,直到我更改订单状态。我找不到更新列表的方法。

据我了解,需要发生的是适配器需要调用其 notifyDateChanged() 方法。我试过直接从处理按钮单击的方法中调用它,我试过一个异步任务,我试过一个处理程序。我的调试方法显示调用正在发生,但列表没有更新。

我可能正在做一些完全愚蠢的事情,但我已经检查了两次和三次。我怀疑有一些我不明白的关键要素。我希望其他人会告诉我我错过了什么。

我发布了一些代码,但显然是错误的。不确定要发布什么代码,因为我认为这更像是一个概念问题而不是编码问题。

【问题讨论】:

  • 如果 adapter 不是 UI 线程上的变量,这将不起作用。
  • 适配器是一个从 SimpleCursorAdapter 扩展而来的 OrderListFragment。适配器用于将我的数据从光标链接到 ListView。
  • 我已经尝试过处理程序和异步任务,但似乎都不起作用。问题的一部分可能是单击的按钮与显示列表的片段位于不同的片段中。
  • 在该适配器的这个片段中存储一个引用,或者您需要使您的适配器public static 并调用YourActivity.adapter
  • 我会试试的,石鸟

标签: android onclick adapter fragment notifydatasetchanged


【解决方案1】:

如果要更新视图,请尝试使用:

  1. 线程+处理程序

  2. 异步任务

【讨论】:

  • 使用 AsyncTask 绝对是解决方案的一部分。 Thread + Handler 对于这种事情来说有点太复杂了。
【解决方案2】:

通过其他发帖者的有用 cmets,我发现我的问题不在于适配器没有在正确的线程上获得 notifyDataChanged() 调用。我输入了证明这一点的调试代码。问题是listview项的背景是基于底层数据本身的变化,所以真正的答案是让Adapter刷新Cursor。我做了一些改变。我修改了用来通知适配器的 AsyncTask。现在 AsyncTask 得到一个新的游标并调用 adapter.changeCursor(cursor) 并得到结果。当状态改变时,AsyncTask 会从 MainActivity(它承载列表和细节片段)中调用。它也在 ListFragment 代码的 onResume() 部分中调用,因此当从详细片段返回时列表将正确更新。效果很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    相关资源
    最近更新 更多