在notifyDataSetChanged后焦点发生变化之前,ListView不会显示更改

2023-12-06

我有一个AlertDialog with a ListView设置为多选就可以了。它还有一个Button on it.

The Button打开另一个AlertDialog如果确定,将从数据集中删除所选项目ListView,然后告诉列表视图的适配器数据集已随notifyDataSetChanged() method.

除了一件事之外,这一切都运行良好。这ListView在我与某些东西交互之前不会更新其内容。然后它会更新为正确的数据。

这不是一个大问题,但我真的很想要ListView立即显示正确,而不是在焦点改变后才显示。

Code:

Button remove = (Button) view.findViewById(R.id.btn_remove_questions_edit_rack);
    final Context con = this;
    remove.setOnClickListener(new OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            Builder warnBuild = new Builder(con);
            warnBuild.setMessage(R.string.question_deletion_warning);
            warnBuild.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener()
            {
                @Override
                public void onClick(DialogInterface dialog, int which)
                {
                    SparseBooleanArray checked = list.getCheckedItemPositions();
                    for (String s : keys)
                    {
                        int i = keys.indexOf(s);
                        if (checked.get(i))
                        {
                            toRemove.add(map.get(s));
                            map.remove(s);
                        }
                    }
                    keys.clear();
                    keys.addAll(map.keySet());
                    ((ArrayAdapter) list.getAdapter()).notifyDataSetChanged();
                    list.clearChoices(); //This makes sure the selection is cleared, if it isn't, some of the other items (those that now has the index of the selected items) will be selected when the View refreshes.
                    dialog.dismiss();
                }
            });

            //Negative button here, not relevant.
        }
    });

Where map and keys are:

final HashMap<String, QualityQuestion> map = new HashMap<>();
//I add items to the map
final ArrayList<String> keys = new ArrayList<>(map.keySet());

And toRemove是我存储要从原始对象上的“确定”按钮时从其所在的实际对象中删除的项目的位置AlertDialog被按下。

这就是我填充我的方式ListView首先:

final ListView list = (ListView) view.findViewById(R.id.list_questions_edit_rack);
    list.setAdapter(
            new ArrayAdapter<String>(this,
                    android.R.layout.simple_list_item_activated_1,
                    keys));

我尝试过类似的事情list.invalidateViews(), list.invalidate以及我在与我的问题类似的问题中发现的其他内容。但这些都没有任何区别。我怀疑我的问题与他们的不同,因为我的物品显然已更新,只需将焦点转移到原始物品上AlertDialog使变化可见。

我怎样才能使ListView立即显示其数据源中的更改,而不是在焦点更改后显示?


通过致电

((ArrayAdapter) list.getAdapter()).notifyDataSetChanged();

您将获得一个新的适配器,它几乎肯定与您在第一个实例中用于填充列表的匿名适配器不同。

另请参阅文档ListView.getAdapter()

返回此 ListView 当前使用的适配器。 返回的适配器可能与传递给 setAdapter(ListAdapter) 的适配器不同,但可能是 WrapperListAdapter。

从这个新适配器的角度来看,数据集没有更改,因为更改发生在实例化之前。

要解决您的问题,请使您的列表和列表适配器成为您的活动类(或您想让它们保持活动的范围)的成员:

private ArrayList<String>    keys;
private ArrayAdapter         myAdapter;
private ListView             list;

然后在你的“onCreate()”中

keys = ...;     // initialization of ArrayList with the needed data 
myAdapter = new ArrayAdapter<String>(this,
                    android.R.layout.simple_list_item_activated_1,
                    keys);
list = (ListView) view.findViewById(R.id.list_questions_edit_rack);
list.setAdapter(myAdapter);

这样,在“OnClickListener”中,您可以通知“myAdapter”:

keys.addAll(map.keySet());
myAdapter.notifyDataSetChanged();

希望这可以帮助 :)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在notifyDataSetChanged后焦点发生变化之前,ListView不会显示更改 的相关文章

随机推荐

  • Laravel 5 函数名称必须是字符串错误

    我收到致命错误 函数名必须是字符串 当尝试return redirect gt to blah blah blah if act ban ban until request gt input ban until if Ragnarok te
  • Pyinstaller 和 Ply IOError:源代码不可用

    我对 pyinstaller 很陌生 但几天来我一直在努力解决这个问题 但我似乎不知道出了什么问题 我的脚本正常运行 但当我尝试使用 pyinstaller 构建时抛出 IOerror 我的模块 包括 ply lex 似乎已包含在内 但也许
  • Winforms - MVP 模式:使用静态 ApplicationController 来协调应用程序?

    背景 我正在构建一个两层 C net 应用程序 第 1 层 使用 MVP 模型 视图 呈现器 设计模式的 Winforms 客户端应用程序 第 2 层 位于实体框架和 SQL Server 之上的 WebAPI RESTful 服务 目前
  • xlib 有活动窗口事件吗?

    我正在尝试编写一个程序 使用 Xlib 跟踪活动窗口何时发生变化 我很难找出最好的方法来做到这一点 到目前为止 这些是我的想法 每秒使用 NET ACTIVE WINDOW 获取活动窗口 如果它已更改 则运行该事件的相关代码 获取所有窗口的
  • 构建入侵检测系统但从哪里开始

    我对入侵检测系统进行了很多搜索 但现在我很困惑 因为现在我应该从哪里开始 我不知道是否存在任何开源可重用代码 但我想用神经网络制作入侵检测和防御系统 从开发人员的角度来看 我的问题是我应该从哪里开始 请就这个话题指导我 我目前正在研究和分析
  • 对于无法解析的 IP 地址,Windows 上的反向 dns 查找会阻塞几秒钟

    我正在使用Java的InetAddress getHostName 执行一些反向 DNS 查找 但它所花费的时间似乎有问题 这是一个代码片段 public static void main String args throws IOExce
  • Angular 6.x Map 运算符对于具有 ActivatedRoute 的 Observable 不存在

    我最近遇到了一个问题 没有找到有关如何使其工作的提示 当我使用ActivatedRoute从我的路由获取数据时 角度无法编译并说Property map does not exist on type Observable
  • 在 Pygame 中实现二维空间中的平滑运动

    我想实现平滑的运动 加速到最大速度 然后在不按下任何键的情况下缓慢减速 类似于小行星中太空飞船的运动 这是我当前的运动代码 import pygame pygame init display pygame display set mode
  • 异常后继续合并

    是否可以继续MERGE后EXCEPTION MERGE INTO copy emp c USING employees e ON c employee id e employee id WHEN MATCHED THEN UPDATE SE
  • 32 位构建中出现“错误的代码生成,Boost 中的指针差异”错误

    在 Mac OS X 10 6 下 我正在构建一个链接到 boost 1 46 的 C 共享库 我正在使用随 Xcode 4 0 安装的命令行工具 64 位版本运行良好 构建 32 位时 我在链接时收到以下错误消息 ld bad codeg
  • 获取带有电子邮件 ID 的联系人

    我需要通过电子邮件获取联系人信息 光标 它们必须是不同的 如果每个联系人收到电子邮件 则必须有一个条目 怎么做 我的目标是 2 0 附带的新联系人 API 1 我尝试使用 CursorJoiner 来做到这一点 但是发生了奇怪的事情 这是我
  • iphone sdk 3.0中的MinimumOSVersion问题

    我已经安装了最新的 iphone sdk 3 0 beta 5 并尝试从该 sdk 提交第一个应用程序构建 但是当我上传到 itunes connect 时 它给我消息 您上传的二进制文件无效 为密钥提供的值 最低操作系统版本是不可接受的
  • Google云数据存储仅存储唯一实体

    我正在尝试使用 Google Datastore 学习 NoSQL 但遇到了唯一性问题 考虑一个电子商务商店 它有类别和产品 您不希望数据库中有两个具有相同 SKU 的产品 所以我用 JSON 插入一个实体 sku 1234 product
  • 如何获取 GL 库/标头?

    include
  • unicode 字符串中的内存位置

    我知道有人在我创作时解释了为什么 Python 2 7 中的相等 unicode 字符串 它们不指向内存中的同一位置 与 普通 字符串一样 gt gt gt a1 a gt gt gt a2 a gt gt gt a1 is a2 True
  • 将未知数量的字段输入到 mysql - 最佳结构?

    我需要存储从多个表单发送的数据 有趣的是 因为这些表单将由我计划向用户提供访问权限的表单生成器创建 我不知道表单中有多少个字段 或者用户将提交多少个字段 我考虑过类似于以下的表结构 表单本身保存为php以进行包含 FormId FormTy
  • 在asp.net core 1.0中创建RSS feed

    我正在 Asp net Core 1 0 MVC 6 工作 我正在尝试编写一个组件来从我的网站提供 RSS 提要 I found 这个帖子这表明 System ServiceModel Syndicate 尚未移植到 ASP NET COR
  • 正则表达式:如何匹配 RFC1918 私有 IPV4 地址范围中的 IP 地址(在 Python 中)?

    RFC1918 将私有 IPv4 地址定义为属于以下任意范围的地址 10 0 0 0 10 255 255 255 172 16 0 0 172 31 255 255 192 168 0 0 192 168 255 255 出于分析目的 我
  • Java Swing:所有 UIDefaults 属性的列表

    问题 在哪里可以获得 Swing 中存在的所有 UIDefaults 属性的列表 我知道可以编写一小段代码来提取并显示它们 但我想知道通过这种方式获得的列表是否真的完整 当我这样做时 我获得了 Metal L F 的 636 个属性 Win
  • 在notifyDataSetChanged后焦点发生变化之前,ListView不会显示更改

    我有一个AlertDialog with a ListView设置为多选就可以了 它还有一个Button on it The Button打开另一个AlertDialog如果确定 将从数据集中删除所选项目ListView 然后告诉列表视图的