Android GridView 多选

2023-11-26

我已经实现了 GridView 并激活了

mGridView.setChoiceMode(GridView.CHOICE_MODE_MULTIPLE_MODAL);

模式。现在,当我长按一个项目时,我可以从网格中选择多个项目。我想通过正常的短暂点击来实现此行为。这可能吗?


首先,我建议考虑一下这个用户场景是否是您一直在寻找的。默认情况下,在 Android UX 中长按即可选择某些内容,这是用户习惯的模式。所以,也许你应该重新考虑整个流程。

话说回来,你真的需要吗?GridView.CHOICE_MODE_MULTIPLE_MODAL?

您可以在适配器级别处理它,只需存储选定的位置并更新此列表即可onClick处理程序:

enter image description here

static final String[] numbers = new String[] {
        "A", "B", "C", "D", "E",....
        "U", "V", "W", "X", "Y", "Z"};

.....

gridView = (GridView) findViewById(R.id.gridView1);
final CustomAdapter adapter = new CustomAdapter(numbers);
gridView.setAdapter(adapter);
gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    public void onItemClick(AdapterView<?> parent, View v,
                            int position, long id) {
        int selectedIndex = adapter.selectedPositions.indexOf(position);
        if (selectedIndex > -1) {
            adapter.selectedPositions.remove(selectedIndex);
            ((CustomView)v).display(false);
        } else {
            adapter.selectedPositions.add(position);
            ((CustomView)v).display(true);
        }
    }
});

Custom BaseAdapter显示自定义视图:

public class CustomAdapter extends BaseAdapter {
    private String[] strings;
    List<Integer> selectedPositions = new ArrayList<>();

    CustomAdapter(String [] strings) {
        this.strings = strings;
    }

    @Override
    public int getCount() {
        return strings.length;
    }

    @Override
    public Object getItem(int position) {
        return strings[position];
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        CustomView customView = (convertView == null) ? 
                                    new CustomView(MainActivity.this) : (CustomView) convertView;
        customView.display(strings[position], selectedPositions.contains(position));
        return customView;
    }
}

自定义视图(在我的例子中 - 带有 TextView 的单元格)。 XML:

<merge xmlns:android="http://schemas.android.com/apk/res/android">
    <TextView
        android:id="@+id/textView"
        android:textColor="#FFF"
        android:gravity="center"
        android:layout_width="match_parent"
        android:layout_height="60dp" />
</merge>

Code:

class CustomView extends FrameLayout {

    TextView textView;

    public CustomView(Context context) {
        super(context);
        LayoutInflater.from(context).inflate(R.layout.custom_view, this);
        textView = (TextView)getRootView().findViewById(R.id.textView);
    }

    public void display(String text, boolean isSelected) {
        textView.setText(text);
        display(isSelected);
    }

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

Android GridView 多选 的相关文章

随机推荐

  • 在 Jenkins 从节点上运行的 Jenkinsfile 中执行 docker build 命令的最简单方法?

    我希望 Jenkinsfile 执行的操作的基本示例 node sh docker build t foo bar 看来我需要将 docker 安装到正在执行 Jenkinsfile 的 Jenkins 从属映像上 有一个简单的方法可以做到
  • 关闭来自服务器的 akka-http websocket 连接

    在我的场景中 客户端发送 再见 websocket 消息 我需要关闭之前在服务器端建立的连接 来自 akka httpdocs 通过从服务器逻辑取消传入连接 Flow 可以关闭连接 例如 通过将其下游连接到 Sink cancelled 将
  • contenteditable 无法在 IE 10 中工作

    我正在尝试创建客户端可编辑表 这是我的代码 它适用于 Chrome Firefox 但不适用于 IE 还有什么与 IE 脚本有关的吗
  • 如何使用java压缩文件夹本身

    假设我有以下目录结构 D reports january 假设一月份有两个 Excel 文件 分别为 A xls 和 B xls 有很多地方都写过如何使用压缩文件java util zip 但我想将 january 文件夹本身压缩到 rep
  • Base64 背景图像多行?

    是否可以放base64背景图像是多行而不是一长行 如果是这样 怎么办 我当前的主体 CSS 是 body background color FFFFFF background image url data image png base64
  • WPF:使用效果显示和隐藏 ItemsControl 中的项目

    我一直在使用这篇很棒的文章作为显示和隐藏具有过渡效果的元素的基础 它工作得非常巧妙 因为它可以让你绑定Visibility属性就像平常一样 然后定义当可见性发生变化时会发生什么 例如 设置其不透明度的动画或触发故事板 当您隐藏某个元素时 它
  • 如何向下滑动 div 然后 .fadeIn() 内容,反之亦然?

    Goal 当用户单击该按钮时 相关 div 将 滑下 stop 淡入内容 当用户再次单击该按钮时 div 将 fade out stop slide up 当前位置 这是一个示例 其中fadeIn and fadeOut发生在正确的时间 但
  • 如何检查我是否处于已检查的上下文中?

    我如何使用 C 代码知道我是否处于checked无论是否有上下文 都不会导致 捕获OverflowException 会带来性能损失吗 块之间的唯一区别是checked vs unchecked是编译器生成的用于基本值类型算术运算的IL指令
  • 使用 ISQL 执行脚本

    我正在创建一个简单的 isql 脚本 但它不起作用 我需要一些帮助来找出它出了什么问题 我需要连接到数据库并执行 SQL 文件 这是我的脚本 名为 script sql CONNECT localhost C Monde Servidor
  • 有 3 列的表。固定中心列宽度。如何在其他两列上共享宽度?

    我有一个 100 宽度的 3 列表格 中心列的宽度必须为 600 像素 如何在用完剩余空间的同时让另外两个宽度相等 table style width 100 tr td left td td style width 600px cente
  • 将复合语句放入 for 循环的条件中

    我有一个人为的例子来演示对特定功能的请求 我想知道是否有人有一个聪明的技巧来做到这一点 以下是一个经常遇到的问题 打印一系列数字 在它们之间打印一个空格 并在末尾打印一个回车符 但没有空格 显而易见的解决方案是使最后一个 或第一个 语句成为
  • 使用 OutVariable 创建 ArrayList

    我确信发生这种情况是有正当理由的 但我不知道它是什么 我有以下代码 Deleted Items 0 ParentNode RemoveChild Items 0 Write Output Deleted 如果我使用调用此代码 Do Some
  • 通过python从音频文件中提取音频频谱

    抱歉 如果我提交重复的内容 但我想知道 python 中是否有任何库可以使您能够从音频文件中提取声谱 我希望能够获取音频文件并编写一个算法 该算法将返回一组数据 TimeStampInFile 频率 幅度 我听说这通常称为节拍检测 但据我所
  • HTTP 错误代码 505

    我已经在 google 上搜索过 505 是 不支持 HTTP 版本 但仍然无法弄清楚我的问题 我有一个带有 Tomcat 的 Web 应用程序 服务器端带有自签名证书来启用 HTTPS 无需验证客户端 客户端将验证服务器证书 我分析了wi
  • WPF 与 WinForms 或丰富的 UI 与稳定的应用程序?您如何看待 Windows 窗体平台的未来? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 WPF 与 WinForm
  • Angular 4 Universal“窗口未定义”

    我的项目运行完美 但是当我实现通用时 我得到 窗口未定义 我的错误如下 node modules hammerjs hammer js 2643 window document Hammer ReferenceError window is
  • OSX:PHP 本地主机错误并且无法加载动态库

    我该如何修复这个 php 错误 PHP Warning PHP Startup Unable to load dynamic library usr lib php extensions no debug non zts 20100525
  • 从 Thread.UncaughtExceptionHandler 启动服务?

    我正在尝试设置一个全局异常处理服务 如中提到的这个答案 这种方法听起来很合乎逻辑 因为崩溃后 我的自定义中的代码Thread UncaughtExceptionHandler可能无法成功执行 要么是因为应用程序可能未处于稳定状态 要么是因为
  • Python matplotlib -> 3D 条形图 -> 调整刻度标签位置,透明条

    我正在尝试使用 Matplotlib 中的 bar3d 在 Python 中创建 3D 条形直方图 我已经到了可以在传递一些数据后在屏幕上显示直方图的地步 但我陷入了以下困境 正确显示轴标签 当前错过了最终 或初始 刻度标签 要么使每个轴上
  • Android GridView 多选

    我已经实现了 GridView 并激活了 mGridView setChoiceMode GridView CHOICE MODE MULTIPLE MODAL 模式 现在 当我长按一个项目时 我可以从网格中选择多个项目 我想通过正常的短暂