【问题标题】:Updating dataset of ArrayAdapter for List with SearchView使用 SearchView 更新列表的 ArrayAdapter 数据集
【发布时间】:2016-06-20 06:07:36
【问题描述】:

我有一个数组适配器可以提供给我的列表视图,该列表视图还包含一个搜索视图。适配器包含 2 个数组列表,例如 A 和 B。A 和 B 最初都包含所有要显示的项目,随后 B 包含搜索的过滤结果(通过实现 setOnQueryTextListener、onQueryTextChange 并在此处过滤适配器来完成)。在搜索结束时,B 的所有项目都从 A 补充。所有项目都可以通过点击它们来删除。我遇到的问题如下:

  1. 说 A 有 10 个项目,B 有 3 个项目(正在进行搜索)。如果 我从 B 中删除了一个项目,同样没有从 A 中删除(由于 A 关闭搜索时填充 B)
  2. 在搜索过程中添加项目(通过浮动操作按钮)时也会发生同样的情况,因为 B 是填充列表视图的活动列表。在这种情况下,A 不会更新。

呼叫adapter.notifyDataSetChanged() 似乎不起作用。我正在寻找的是数组 A 和 B 始终保持一致,即在搜索过程中添加/删除一个项目会将其从两者中删除。我是否需要向适配器添加方法,每次添加/删除项目时都需要调用这些方法,其中我需要检查是否正在进行搜索并适当地处理案例?这似乎不是一个最佳解决方案。我对 Android 开发比较陌生,所以我希望有人能指出我正确的方向,因为我找不到与我类似的问题的解决方案。谢谢!

【问题讨论】:

  • 你需要了解Filterable接口和Filter类,adapter.getFilter().filter(...)是过滤掉项目的正常方式
  • 问题不在于过滤,而在于过滤/搜索期间完成的更新。关于它的快速搜索似乎并没有真正指向我的问题的解决方案:(例如stackoverflow.com/a/14369336/1113598
  • 研究通用 adapter,注意私有 ArrayFilter 类,适配器基于 std ArrayAdapter 类,注释中描述了 2 个小但非常有用的更改
  • 好的,我检查了适配器,除了过滤之外,我看到适配器上的添加/删除/清除等方法映射了两个数据集上的更改,即实际列表和过滤列表,所以存在与我所做的相比,这种过滤方法有什么特别的优势吗?也许我在这里遗漏了一些明显的东西..
  • add/remove/clear用于修改适配器内容,不打算在过滤时使用,过滤时只应使用adapter.getFilter().filter(...)

标签: android listview android-arrayadapter searchview


【解决方案1】:

为了回答我自己的问题,结果证明解决方案要简单得多,因为我走在了正确的轨道上。我所要做的就是向适配器添加一个公共方法,我为所有此类添加/删除操作调用该方法,无论该操作是否在过滤时完成。在删除的情况下,在这个公共方法中,我只是从原始和过滤的数据源中删除了对象。从原始列表中删除,还通过引用将其从主数组列表(在显示列表的片段中)中删除。唯一需要注意的重要一点是,为了获取要删除的正确对象,我添加了另一个方法,该方法根据发出删除的位置从过滤列表(始终是活动数据源)中返回对象。这很重要,因为如果主列表中有 4 个项目,但在过滤时删除了第一个项目(占据了主列表中的第 3 个位置),则将删除不正确的对象,即主列表中的第一个项目列表。希望这可以帮助遇到这种情况的任何人。

【讨论】:

    猜你喜欢
    • 2013-07-22
    • 1970-01-01
    • 1970-01-01
    • 2012-07-24
    • 1970-01-01
    • 2019-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多