ListView 保持选中状态?

2024-03-24

我有一个充满项目的列表视图,在用户选择一个项目后它会亮起,然后恢复正常。有没有办法让用户在 ListView 中选择一个项目时它保持选中状态并突出显示?


显然,“消失的选择”是有意设计的。这是一种叫做“触摸模式 http://developer.android.com/resources/articles/touch-mode.html“。我通读了该文档,但仍然不知道为什么他们认为这是一个好主意。我的猜测是,由于 Android 最初是为小屏幕设备设计的,他们希望你会用一个列表填满屏幕,然后然后,当用户单击某个项目时,移动到不同屏幕上的新列表。因此,用户不会意识到 Android 丢失了所选项目的跟踪。

但是,例如,如果您希望用户选择一个项目,然后在同一屏幕上显示有关该项目的信息,则这种行为非常烦人。如果选择消失,用户如何知道他们点击了什么(当然假设用户的注意力集中度像金鱼一样)?

一种可能的解决方案是将所有列表项更改为单选按钮。我不太喜欢这个解决方案,因为它浪费了屏幕空间。我宁愿只使用背景颜色来显示选择了哪个项目。到目前为止,我已经看到了一种解决方案,但它并不十分完整或通用。所以这是我的解决方案:

1. 在 XML 布局文件中

转到您的 ListView 元素和以下属性:android:choiceMode="singleChoice"。我不完全确定它的作用(它本身不允许用户选择任何内容),但如果没有此属性,下面的代码将无法工作。

2.定义如下类

它用于跟踪所选项目,还允许您在 Java 中模拟按引用传递:

public class IntHolder {
    public int value;
    public IntHolder() {}
    public IntHolder(int v) { value = v; } 
}

3. 将以下代码放在某处

我假设你把它放在你的 Activity 中,但它实际上可以放在任何类中:

static void setListItems(Context context, AdapterView listView, List listItems, final IntHolder selectedPosition)
{
    setListItems(context, listView, listItems, selectedPosition, 
                 android.R.layout.simple_list_item_1, 
                 android.R.layout.simple_spinner_dropdown_item);
}
static void setListItems(Context context, AdapterView listView, List listItems, final IntHolder selectedPosition, 
                         int list_item_id, int dropdown_id)
{
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        public void onItemClick(AdapterView<?> list, View lv, int position, long id) {
            selectedPosition.value = position;
        }
    });
    ArrayAdapter<CharSequence> adapter = new ArrayAdapter<CharSequence>(context, list_item_id, listItems) { 
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View itemView = super.getView(position, convertView, parent);
            if (selectedPosition.value == position)
                itemView.setBackgroundColor(0xA0FF8000); // orange
            else
                itemView.setBackgroundColor(Color.TRANSPARENT);
            return itemView;
        }
    };
    adapter.setDropDownViewResource(dropdown_id);
    listView.setAdapter(adapter);
}

此代码做了两件事:它附加您的列表项(例如List<String>)到你的ListView,它会覆盖ArrayAdapter.getView()使用一些更改所选项目背景的代码。

4. 使用该代码设置您的列表

例如:

ListView _list;
IntHolder _selectedItem = new IntHolder(-1); // nothing selected at first

@Override
protected void onCreate(Bundle savedInstanceState) {
    ...
    _list = (ListView)findViewById(R.id.list);
    List<String> items = Arrays.asList("Item 1", "Item 2", "Item 3");
    setListItems(this, _list, items, _selectedItem);
}

就这样!上面假设您想​​要单一选择。我想,通过对 getView() 进行一些小的修改,您也可以支持多重选择,但您可能应该使用复选框。

Warning:该解决方案需要进一步开发。如果用户使用箭头键或按钮选择一个项目,该项目将not从 IntHolder 的角度进行选择。如果用户按下未标记的按钮(该按钮的名称是什么?“Enter”?),那么该项目将成为“正式”选择,但你会遇到另一个问题,因为如果用户再次使用箭头键,它看起来会有点像就像选择了两个项目一样。如果您弄清楚如何使 IntHolder 中的“内部选择”与“键盘选择”或任何名称保持同步,请发表评论。什么is无论如何,它打电话了?

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

ListView 保持选中状态? 的相关文章

  • Android TextView 上标

    So I m trying to add superscipt subscript to a TextView basically trying to make a fraction be displayed as 1 2 Not sure
  • Android 中的“ffmpeg 有文本重定位”错误

    我正在构建一个 Android 视频发送应用程序 我需要在上传之前对视频进行压缩 在本例中 我选择使用 FFmpeg 的 Android 包装器 https github com hiteshsondhi88 ffmpeg android
  • 如何在每个项目的列表视图中实现简单的点赞按钮

    我的列表视图项目中有某些条目 我有一个简单的 喜欢按钮 不是像 Facebook 的按钮 您可以看到上面提到的屏幕截图 供参考 当我点击 喜欢 按钮的那一刻 我希望更改 喜欢 按钮的颜色 并且 喜欢 按钮的颜色应保持不变 改变了喜欢 当我再
  • Android 中 Facebook 和 Google+ 登录的 onActivityResult 代码

    Android 中登录的 Facebook API 代码很简单 方法如下活动结果 is protected void onActivityResult int requestCode int resultCode Intent data s
  • 如何设置 MediaCodec 创建的编码器缓冲区大小

    我正在尝试使用 Nexus 来测试 Mediacodec API 的编码 我可以看到编码器提供的inputBuffers是119040 通过记录inputBuffers capacity 但帧的大小 即输入 是 460800 我收到错误消息
  • android java.lang.OutOfMemoryError 错误

    当我从网站下载大数据时 我收到以下错误信息 I global 20094 Default buffer size used in BufferedInputStream constructor It would be better to b
  • 更改Android TabWidget底部栏颜色

    如何更改 TabWidget 底部栏的颜色 我已经成功更改了选项卡背景颜色 但底部栏仍然是灰色 橙色 并且我在 Android 文档和源代码中找不到与此相关的任何信息 谢谢 See 启用 禁用此行 tabHost getTabWidget
  • Android 本机崩溃从 /system/framework/arm/boot.oat 启动

    最近在 Google Play 中更新我的应用程序后 我开始收到大量崩溃报告 所有这些报告都来自搭载 Android 5 的三星设备 较低的 Android 版本可以正常工作 其他制造商的 Android 5 设备也可以正常工作 我没有任何
  • Android AsyncTask 启动另一个 AsyncTask

    我目前正在 AsyncTask 的 onPostExecute 方法中执行类似的操作 其中NewTask is not当前正在执行的任务 private class OlderTask extends AsyncTask
  • AsyncTask加载图像RecyclerView

    我正在尝试创建一个与该应用程序类似的应用程序 一个在回收视图中包含一些图像和描述 卡片视图 的应用程序 https lh5 ggpht com At pHbZqdzlgmAqY0jbiztDYIAts1wOYWGTOHibmFHuq8CFA
  • Android avd 管理器根本不工作 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我最近想尝试创建一个 Android
  • 如果使用 PackageManager 禁用应用程序图标,是否会导致该应用程序的自动更新出现问题?

    我有一个应用程序 其中使用以下代码隐藏应用程序图标 PackageManager p getApplicationContext getPackageManager p setComponentEnabledSetting getCompo
  • 使用 ADB 更改 Android 壁纸?

    我想知道是否可以使用我的笔记本电脑从 ADB 更改 Android 壁纸 我不知道是否存在任何命令 或者我是否需要将图片复制到文件夹或编辑文本文件 如果可以的话 我需要通过 ADB 解决这个问题 谢谢大家 您只需要启动正确的壁纸设置意图 由
  • Android Widget 实现

    嗨 如果这个问题很愚蠢 我提前道歉 我对 Android 编程相当陌生 而且学得很快 我刚刚创建了一个任务提醒应用程序 并且想将该应用程序转换 实现为一个可以在主屏幕上查看的小部件 有什么方法吗 这可能吗 Thanks 如果没有更多关于您的
  • Android 堆栈跟踪显示生产 Firebase crashlytics 中的测试代码

    该应用程序的 Play 商店版本的 Firebase crashlytics 中报告了该异常 当用户进入启动活动时会发生这种情况 任何帮助 将不胜感激 谢谢 没有其他可用的堆栈跟踪有助于跟踪代码发生的位置 Fatal Exception j
  • 权限拒绝:开放提供商

    我创建了一个自定义内容提供程序 更多应用程序将访问该内容提供程序 我已在提供程序 AndroidManifest xml 文件中包含了权限标签 在第二个应用程序中 我包含了 use permissions 标签 但没有成功 Logcat 向
  • 如何暂时禁用Android按钮[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我想暂时禁
  • 将阿拉伯语从 android 发送到 PHP 文件

    尝试使用下面的代码将阿拉伯文本从 android 发送到 PHP 文件 Button setOnClickListener new OnClickListener public void onClick View v TODO Auto g
  • admob 连接被拒绝

    我刚刚开始将 admob 添加到我的 Android 应用程序中 并开始使用 admob 网站上提供的横幅必需品示例 这是示例代码 public class BannerEssentials extends Activity Overrid
  • 刷新 ArrayAdapter onResume [notifyDataSetChanged() 不起作用]

    我正在使用片段创建一个联系人列表应用程序 其中一个片段是联系人列表中的姓名列表 另一个是其余详细信息 这是显示名称列表的类 public class MyListFragment extends ListFragment private C

随机推荐

  • 突出显示 python 堆栈跟踪

    我正在处理相当复杂的项目 并且一次又一次地我必须通过查看堆栈跟踪来缩小问题范围 它们恰好很长 并且同时涉及 我的 代码 标准库代码和第 3 方库代码 大多数时候 真正的问题出在 我的 代码中 并且在堆栈跟踪中立即找到它对于眼睛来说有点困难
  • 处理 ASP.NET MVC 控制器构造函数中发生的异常

    处理控制器构造函数内发生的异常的最佳方法是什么 我能想到的就是使用 Application OnError 或在我的 ControllerFactory 中放置一个 try catch 这些解决方案似乎都不理想 Application On
  • node.js 区分发出 http 请求时的错误

    我的node js应用程序正在使用http request到 REST APIhttp army gov launch nukes我需要区分三种可能的情况 Success 服务器回复肯定 我知道我的敌人已经被消灭了 Failure 要么我从
  • 如何将 QGraphicsItem QList 保存到文件然后读取它? Qt C++

    我有一个包含 QGraphicsItem 的列表 这个列表让我可以画线 我查看了文档 但没有看到如何将点保存在文件中 然后读取文件的点才能显示它们 这是我的代码 QList
  • 如何解决 Angular 项目中的 Tailwind 和 Bootstrap 冲突

    我在同一个 Angular 项目中使用 Tailwind CSS 和 Bootstrap ngx bootstrap 大多数情况下 他们相处得很好 然而 当涉及到填充和边距时 它们就像兄弟姐妹一样互相争斗 我想使用 Tailwind 进行填
  • LINQ:通过多个属性将对象列表分组到列表列表中的更好方法?

    我有一个这样的对象列表 var cmps new List
  • 如何加快创建聚集索引的速度

    在 SQL Server 中 如果我想向聚簇索引定义添加一新列 则没有用于更改聚簇索引的选项 唯一的选择是删除并使用新定义创建簇索引 据我了解 对于大容量表来说 删除和创建簇索引是非常昂贵且耗时的 聚集索引创建会重建表上的所有非聚集索引 这
  • SharePoint 列表项权限

    我想以编程方式实现它 以便用户只能看到列表中的特定项目 基本上 在创建项目时运行的工作流程中 我将执行一些操作并通知一些人有关此项目的信息 我还希望它更改项目的权限 以便只有特定用户 根据项目内容在运行时查找 才能读取该项目 有权访问该列表
  • 如何轻松更改PNG图像的颜色? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有代表扑克牌的 PNG 图像 它们是标准颜色 梅花和黑桃是空白 方块和红心是红色 我想通过将梅花转换为绿色 将方块转换为蓝色来创建
  • 使用 php 从给定 URL 下载文件,通过传递用户名和密码进行 http 身份验证

    我需要使用 php 代码下载文本文件 该文件具有 http 身份验证 我应该为此使用什么程序 我应该使用fsocketopen或卷曲或有其他方法可以做到这一点吗 我正在使用 fsocketopen 但它似乎不起作用 fp fsockopen
  • OSX:如何从 IOUSBDeviceInterface 或位置 id 获取卷名称(或 bsd 名称)

    我正在尝试编写一个应用程序 将特定的 USB 字符串描述符 USB 大容量存储设备 与其卷或 bsd 名称相关联 因此 代码会遍历所有连接的 USB 设备 获取字符串描述符并从其中之一提取信息 我想获取这些 USB 设备的卷名 我找不到合适
  • android:noHistory="true" 是如何工作的?

    假设我有一个带有菜单的基本活动 当我单击菜单项 A 时 它会转到活动 A 我再次打开菜单 然后转到 B 从 B 返回到 A 这样来回一会儿 所以堆栈将是 A B A B A B 当我按下后退按钮时 它会按预期向后浏览堆栈 然而 假设我不想要
  • v-bind 错误:v-bind' 是未声明的前缀

    我正在 asp net 中使用 Orckestra CMS 在 Composite 之前 和 Razor 模板 并尝试使用 Vue 框架 使用 option text 时一切都很好
  • Jtable 编辑单元格的外观和感觉

    有一个JTable with DefaultTableModel 有桌子的setforeground setbackground and setselectioncolor方法 另外 当您编辑单元格时 您有table setDefaultE
  • 获取图像的特定部分(图片)

    我想剪切图片的特定部分 并用它来将裁剪后的图像与硬盘中存储的另一图像进行比较 问题是我不知道如何获取源图像的 特定部分 我知道要裁剪的图像的位置 X Y 这将加载原始文件并创建一个从 0 0 开始 尺寸为 64x64 的裁剪版本 Bitma
  • MVVM 中的故事板动画

    我试图淡入然后淡出文本块以在 MVVM 中显示成功消息 但我无法让它再次淡出 我看了这个 WPF MVVM 属性更改动画 https stackoverflow com questions 1649828 wpf mvvm property
  • 错误:LaTeX 中缺少 \begin{document} [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我的 LaTeX 文档中有错误 运行我的文件时出现错误 LaTeX Error Missing begin document 和这个标签
  • 如何跟踪语速

    我正在开发一个跟踪语速的 iPhone 应用程序 并希望使用 Nuance Speechkit https developer nuance com public Help DragonMobileSDKReference iOS Spee
  • 在另一个角上绘制一个图形

    我应该如何在 R 中的另一个图的角落呈现一个小图 我知道这个问题已经结束了 但我要把这个例子留给后代 一旦掌握了基础知识 您就可以使用基本的 网格 包轻松地进行这样的自定义可视化 这是我使用的一些自定义函数的快速示例以及绘制数据的演示 自定
  • ListView 保持选中状态?

    我有一个充满项目的列表视图 在用户选择一个项目后它会亮起 然后恢复正常 有没有办法让用户在 ListView 中选择一个项目时它保持选中状态并突出显示 显然 消失的选择 是有意设计的 这是一种叫做 触摸模式 http developer a