【问题标题】:Android ListView and EditTexts with live data带有实时数据的 Android ListView 和 EditTexts
【发布时间】:2012-04-23 23:57:25
【问题描述】:

我有一个简单的 ListView,由我的 ArrayAdapter 支持,它每隔约 5 秒左右更新一次新数据。每隔 5 秒,我会在 ArrayAdapter 上调用 notifyDataSetChanged,这会导致 ListView 被新数据重绘。所有这一切都很好,我每 5 秒就会看到一次新数据。

但是,在我的 ArrayAdapter 的 getView 方法中,我正在膨胀一个包含 EditText 的 LinearLayout。这是我要解决的问题:

  1. 用户在某些输入的某一行和类型中选择了 EditText。
  2. 用户专注于 EditText 超过 5 秒。
  3. notifyDataSetChanged 在新数据到达我的数组适配器时被调用。
  4. 用户失去对 EditText 的关注,因为它已被重绘。 notifyDataSetChanged 似乎会导致所有 ListView 元素都被重绘。

让用户保持关注此 EditText 但确保数据始终是最新的最佳方式是什么?

谢谢,

肖恩

【问题讨论】:

  • 编写自定义BaseAdapter,提供实际(内存中可用,不为空)视图,选择一个(比如哪个用户选择并键入文本或暂时聚焦)。更新数据:在适配器中存储描述数据的对象列表,然后抛出列表,如果视图可用,手动更新它(如getView 方法)与关联的(新)对象。有点模仿notifyDataSetChanged
  • 嗨弗拉基米尔 - 感谢您的回复。我应该在我原来的问题中真正概述这一点,但如果可能的话,我更愿意继续使用 notifyDataSetChanged。遍历 ListView 中的每一行并更新视图而不是依赖于调用 getView 不是我想立即走下去的路。由于我的数据集中的项目数量可能会发生变化,我不确定列表视图迭代解决方案对我来说是否可行。还是谢谢你。

标签: android listview android-edittext android-arrayadapter


【解决方案1】:

这可能不是最好的方法,而是一种快速的方法。覆盖notifydatasetchanged,首先检查你是否有一个元素有焦点(或者当它获得焦点而不丢失它时存储它),存储输入,调用super.notifyDatasetChanged,写入旧值。

如果适配器的项目太多,这可能不是一个好的解决方案。

【讨论】:

  • Siyamed - 感谢您的评论。如果我的适配器有“太多”项目,您是否介意扩展一下为什么这个解决方案不是一个好主意?
猜你喜欢
  • 2011-06-10
  • 2012-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多