带有“标签”的 Android ListView

Posted

技术标签:

【中文标题】带有“标签”的 Android ListView【英文标题】:Android ListView with “tabs” 【发布时间】:2019-12-17 19:07:07 【问题描述】:

来自reddit新闻源的图片

(https://i.stack.imgur.com/6YXMK.jpg)

我正在创建一个具有从 sqlite 数据库填充的列表视图的应用程序。每个数据库项的状态都可以是“已解决”或“未解决”。

我希望列表视图有 3 个“标签”,标签为“所有项目”、“已解决的项目”和“未解决的项目”,并带有相应的 sqlite 查询来填充每个标签。

它的行为应该与图片中的相似。

我以为这将是一个选项卡式列表视图,并且已经根据这些搜索词观看了一周的教程,这让我陷入了一个黑暗的碎片兔子洞和更改 gradles 等等。我不确定标签是我真正想要的。

我可以用三个按钮来代替每个按钮运行不同的查询并填充我的 listviewcontainer 吗?

理想情况下,当页面打开时,第一个“选项卡”会突出显示,并且列表视图会填充所有记录。当按下其他选项卡时,它们会突出显示并运行新的查询。

另一种方法会更好吗?

我不是要代码,我只是想要一些关于我的研究重点的概念方向。

【问题讨论】:

您已经尝试过什么?发布您的代码。 您可以将TabLayout 与三个Fragment 元素一起使用,这些元素将包含具有适当数据库查询的不同列表,如果您可以使用共享ViewModel,这并不难。以其他方式,您可以设置 3 个Buttons 和一个列表视图,然后只需在按钮onClick 中填充列表并通知notifyDataSetChanged()。或者您可以执行一个查询,然后只过滤项目并将它们设置为列表内容,而不会干扰整个列表。如果您能详细说明解决问题的首选方法,我可以为您提供代码。 @JakeB ... 还没有代码。正如我所说,我一直在阅读选项卡式视图,因为这是我认为我想要的,但是我为选项卡式列表视图找到的解释似乎是一种非常复杂的方式来执行应该是一个相对简单/常见的任务。 @Blind Kai ...感谢您的反馈。我认为按钮将是更直接的方法。仍然不确定如何在已经按下其中一个按钮的情况下使 Activity 默认打开,但是当我到达它时我会越过那座桥。是时候重新开始工作了。 您可以使用RecyclerView获得所需的结果我正在测试提供的代码,知道吗,等待更新。 【参考方案1】:

如果我说得对,您需要在不同的列表中过滤您的查询结果。对数据库进行大量查询并不是特别好的事情,特别是如果这将是一个漫长的过程并且多次执行会耗费时间和内存。 因此,为了使其工作,您可以将完整的查询结果简单地存储在一个变量中,并使用自定义方法 setList() 更改 RecyclerView 数据,然后使用 notifyDataSetChanged() 应用更改。

要使其正常工作,您需要了解“RecyclerView 的工作原理”,然后就可以了。

因此,在提供正确的逻辑后,您可以根据需要(例如按元素值)简单地拆分整个查询结果,如上所示:

关于下面的代码:

list - 是你的查询结果 leftFilterListrightFilterList - 是包含已排序项目的列表 adapter.setList(rightFilterList) - 设置 RecyclerView 数据(在我们的例子中过滤项目) adapter.notifyDataSetChanged() - 用于通知RecyclerView 列表已更改,他需要重建它。

所以我们有两个Buttons 和以不同方式填充项目的逻辑。

public void left(View view) 
    ArrayList<ExampleItem> leftFilterList = new ArrayList<>();
    for (ExampleItem item : list) 
        if (item.getTitle().length() % 2 == 0) 
            leftFilterList.add(item);
        
    
    adapter.setList(leftFilterList);
    adapter.notifyDataSetChanged();


public void right(View view) 
    ArrayList<ExampleItem> rightFilterList = new ArrayList<>();
    for (ExampleItem item : list) 
        if (item.getTitle().length() % 2 == 1) 
            rightFilterList.add(item);
        
    
    adapter.setList(rightFilterList);
    adapter.notifyDataSetChanged();

以及过滤的结果*:

抱歉吐司文本有误。它显示了整个列表的大小。

【讨论】:

你真的只是在 94 秒内写完所有这些吗?!?我长大后想成为你。 @Matthew 我目前正在使用RecyclerView 和列表,所以我已经有了一个设置为RecyclerView 的项目,所以我只添加了两个按钮并对其进行了编码,如您在上面看到的。设置它并不难,只需查看文档和视频即可。

以上是关于带有“标签”的 Android ListView的主要内容,如果未能解决你的问题,请参考以下文章

带有标签的 Android 操作栏 Sherlock

[Android][Framework]Activity启动流程

android中的动态标签,带有来自json的动态内容

带有标签和 Viewpager 的 Android 片段

Android:onListItemClick 未打开 .xml 文件

Android Studio 自动补全