【问题标题】:Set State of Switch in RecyclerView Based on Comparison of Values in an ArrayList<String> and a TextView根据 ArrayList<String> 和 TextView 中的值比较设置 RecyclerView 中的开关状态
【发布时间】:2018-07-11 00:00:35
【问题描述】:

我有一个 RecyclerView,它显示设备上当前安装的应用程序列表。每行包括应用程序的名称、其包名称和一个开关。当 Switch 被选中时,包名被添加到一个 ArrayList 中。如果用户再次点击该 Activity,我需要重新填充列表并根据之前添加到 ArrayList 的内容设置 Switches 的状态。

我必须实现的总体思路是将 RecyclerView 中的包名称与存储在 ArrayList 中的包名称进行比较,当匹配时,需要将该行的 Switch 设置为选中。

我不确定如何最好地做到这一点。我认为它需要在使用适配器的活动中完成,而不是适配器本身。我知道这也会涉及到一个循环。

有人知道如何实现吗?

OP(2018 年 1 月 30 日):https://coderanch.com/t/690164/mobile/Set-Switch-State-Based-Comparison

【问题讨论】:

    标签: java android arraylist android-recyclerview


    【解决方案1】:

    你可以这样实现它: 您的 Adapter 会收到一份 ViewModel 列表,其中包含

    String displayName;
    String identifier;
    boolean isChecked;
    

    您的适配器可以通知侦听器

    interface AdapterListener {
        void onSwitchChanged(ViewModel viewModel);
    }
    

    我们的监听器可以是 Presenter 或 ViewModel。您的侦听器可能还管理您的所有 ViewModel(因为他可能已经创建或从另一个实例获取它们)。当你需要你的 ArrayList 时,你可以

    a) 按需实例化它(迭代您的 ViewModel 并提取那些被检查的)

    b) 您的 Listener 可以直接管理列表。您可以创建List&lt;String&gt; 并添加/删除应用标识符。您无需循环,只需调用list.remove("THEAPPIDKEY");,列表将正确删除您要删除的密钥。

    【讨论】:

    • 循环似乎是必要的,因为 RecyclerView 中显示的包可能会发生变化(如果用户卸载应用程序)。这就是为什么我建议将 RecyclerView 中显示的包与所选包的 ArrayList 中显示的包进行比较。否则,如果应用尝试为不存在的包设置开关,是否有可能出现 nullPointerException?
    • 将列表提供给recyclerview 的模块,例如presenter 或viemodel,负责更改列表。如果用户卸载应用程序,Viewmodel / Presenter 可能正在监听一个监听器(广播接收器或类似的东西)。当演示者收到通知,应用程序已卸载时,它可以删除列表中的条目,但它还必须告诉 recyclerview 删除该项目。没有NPE
    【解决方案2】:

    我通常将 Adapter 类作为我的 Activity 类中的子类。这样,Adapter就可以访问属于Activity的字段了。

    在任何情况下,适配器都必须知道它应该显示为“已打开”的值。因此,如果您有一个单独的适配器类,则需要将 ArrayList 传递给适配器(例如,通过其构造函数)。

    【讨论】:

    • 这样会导致Activity臃肿;我不建议这样做。将您的适配器提取到另一个文件中,这有助于保持代码干净。
    • 在我最近对我的问题进行的研究中,我看到很多人对他们的适配器进行子类化。然而,正如@FlorianHansen 所建议的那样,我发现这种做法是为了创建“臃肿的代码”。我使用一个单独的类来保持清洁。
    【解决方案3】:

    将数据存储在自定义类中并从中创建一个数组列表。当该列表传递给适配器时,您可以将值拉回。

    class PhoneItem{
    boolean switchState;
    String blah;
    String foo;
    }
    //get the data from the originating class
    ArrayList<phoneItem>phones = new Arraylist();
    mMySwitch.setChecked(phones.get(viewHolderCount).switchState);
    

    【讨论】:

    • 我可能错了,但正如我向 Florian Hansen 建议的那样,需要进行比较,因为 RecyclerView 中显示的包可能会发生变化(如果用户卸载应用程序)。如果我的 Activity 尝试设置一个不存在的 Switch,它将抛出 NullPointerException。对吗?
    猜你喜欢
    • 1970-01-01
    • 2017-08-30
    • 2019-09-27
    • 2018-03-02
    • 1970-01-01
    • 1970-01-01
    • 2021-05-16
    • 2015-01-19
    • 1970-01-01
    相关资源
    最近更新 更多