列表多选配合取消和确定以及全选使用

2023-11-02

效果

代码

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/rl_spinner_up"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:background="@color/colorWhite">

    <TextView
        android:id="@+id/tv_spinner_multi"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_centerHorizontal="true"
        android:gravity="center"
        android:text=""
        android:textAllCaps="false"
        android:textColor="@color/colorTv" />

    <CheckBox
        android:id="@+id/cb_spinner_multi"
        android:layout_width="13dp"
        android:layout_height="9dp"
        android:layout_centerVertical="true"
        android:layout_marginLeft="8dp"
        android:layout_toRightOf="@id/tv_spinner_multi"
        android:background="@drawable/selector_item_type"
        android:button="@null"
        android:checked="true"
        android:clickable="false"
        android:focusable="false"
        android:gravity="center" />

</RelativeLayout>
public class MyAdapter extends BaseAdapter {

    private Context mContext;
    private List<String> mList;
    //用来控制CheckBox的选中状况
    private static HashMap<Integer, Boolean> isSelected;

    public MyAdapter(Context context, List<String> list, HashMap<Integer, Boolean> isSelected) {
        this.mList = list;
        this.mContext = context;
        this.isSelected = isSelected;
        initData();
    }

    //初始化isSelected的数据
    private void initData() {
        for (int i = 0; i < mList.size(); i++) {
            getIsSelected().put(i, false);
        }
    }

    private void initDataTrue() {
        for (int i = 0; i < mList.size(); i++) {
            getIsSelected().put(i, true);
        }
    }

    public void updata(HashMap<Integer, Boolean> isSelectedTrue) {
        for (int i = 0; i < isSelectedTrue.size(); i++) {
            this.isSelected.put(i, isSelectedTrue.get(i));
        }
        notifyDataSetChanged();
    }

    @Override
    public int getCount() {
        return mList.size();
    }

    @Override
    public Object getItem(int position) {
        return mList.get(position);
    }

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

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        String bean = mList.get(position);
        LayoutInflater inflater = LayoutInflater.from(mContext);
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.item_layout, parent, false);
            holder = new ViewHolder();
            holder.tv_spinner_multi = convertView.findViewById(R.id.tv_spinner_multi);
            holder.cb_spinner_multi = convertView.findViewById(R.id.cb_spinner_multi);
            holder.rl_spinner_up = convertView.findViewById(R.id.rl_spinner_up);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.tv_spinner_multi.setText(bean);
        //监听checkBox并根据原来的状态来设置新的状态
        holder.rl_spinner_up.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                if (isSelected.get(position)) {
                    if (position == 0) {
                        initData();//如果是0位置,就将所有的都设置成不选中
                    } else {
                        isSelected.put(0, false);//有一个非0位置的不选中的时候,0位置的就不会被选中
                        isSelected.put(position, false);
                        setIsSelected(isSelected);
                    }
                } else {
                    if (position == 0) {
                        initDataTrue();//如果是0位置,就将所有的都设置成选中
                    } else {
                        //非0位置的时候,判断其他的子项是否已经选中
                        int count = 0;
                        for (int i = 0; i < getIsSelected().size(); i++) {
                            if (i != 0 && i != position && getIsSelected().get(i)) {
                                count++;
                            }
                        }
                        if (count == mList.size() - 2) {
                            isSelected.put(0, true);
                        }
                        isSelected.put(position, true);
                        setIsSelected(isSelected);
                    }
                }
                notifyDataSetChanged();
            }
        });

        //根据选中情况设置字体颜色
        if (isSelected.get(position)) {
            holder.tv_spinner_multi.setTextColor(mContext.getResources().getColor(R.color.colorAccent));
        } else {
            holder.tv_spinner_multi.setTextColor(mContext.getResources().getColor(R.color.colorTv));
        }

        // 根据isSelected来设置checkbox的选中状况
        holder.cb_spinner_multi.setChecked(getIsSelected().get(position));
        return convertView;
    }

    public static HashMap<Integer, Boolean> getIsSelected() {
        return isSelected;
    }

    public static void setIsSelected(HashMap<Integer, Boolean> isSelected) {
        MyAdapter.isSelected = isSelected;
    }

    private static class ViewHolder {
        private TextView tv_spinner_multi;
        private CheckBox cb_spinner_multi;
        private RelativeLayout rl_spinner_up;
    }
}
private String area[] = {"全部", "北京", "上海", "广州", "深圳", "郑州", "南京"};
private HashMap<Integer, Boolean> isSelectedArea = new HashMap<Integer, Boolean>();
private HashMap<Integer, Boolean> isSelectedAreaTrue = new HashMap<Integer, Boolean>();

listview = (ListView) findViewById(R.id.listview);
myAdapter = new MyAdapter(this, Arrays.asList(area), isSelectedArea);
listview.setAdapter(myAdapter);
initData();

//初始化isSelectedTrue的数据
private void initData() {
	for (int i = 0; i < area.length; i++) {
		isSelectedAreaTrue.put(i, false);
	}
}

public void onClick(View view) {
	switch (view.getId()) {
		case R.id.tv_show:
			if (listview.getVisibility() == View.VISIBLE) {
				listview.setVisibility(View.GONE);
			} else {
				listview.setVisibility(View.VISIBLE);
			}
			break;

		case R.id.btn_spinner_cancel_area:
			listview.setVisibility(View.GONE);
			myAdapter.updata(isSelectedAreaTrue);
			break;

		case R.id.btn_spinner_ok_area:
			List<String> selectedListArea = new ArrayList<>();
			listview.setVisibility(View.GONE);
			isSelectedArea = myAdapter.getIsSelected();
			for (int i = 0; i < isSelectedArea.size(); i++) {
				isSelectedAreaTrue.put(i, isSelectedArea.get(i));
				if (isSelectedArea.get(i).equals(true)) {
					selectedListArea.add(area[i]);
				}
			}
			break;
	}
}

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

列表多选配合取消和确定以及全选使用 的相关文章

  • Android 在画布上遮罩位图生成黑色空间

    我有一个蒙版位图 一半是红色 一半是透明的 如下所示https www dropbox com s 931ixef6myzusi0 s 2 png https www dropbox com s 931ixef6myzusi0 s 2 pn
  • Android 卷页动画

    我对 Android 动画有点陌生 目前我正在开发一个故事活动 需要像 iPhone 中那样使用卷页动画 我发现 iPhone 中有一种方法可以做到这一点 但我仍然找不到在android中做的方法 所以请帮我解决这个问题 谢谢大家 谷歌代码
  • 如何使用 WifiEnterpriseConfig 设置“使用系统证书”

    我想为我的应用程序的用户配置企业 WiFi 网络 因此 用户必须输入用户名和密码 其余的由应用程序处理 身份验证由 RADIUS 服务器 FreeRadius 3 处理 该服务器使用 LetsEncrypt 颁发的证书 因此无需导入我自己的
  • 包管理器已去世

    我收到一位安装了很多应用程序的用户发来的邮件 称当我的应用程序使用以下代码收集活动信息时 他遇到了问题 getPackageManager queryIntentActivities mAinIntent 0 完整来源在这里 https g
  • Facebook4j API:搜索

    我正在使用 Facebook4j 通过关键字获取状态 facebook4j conf ConfigurationBuilder fac new facebook4j conf ConfigurationBuilder fac setDebu
  • putExtra() 和 setData() 之间的区别

    putExtra 和 setData 有什么区别 我已经阅读了 android 文档 但没有太大帮助 还有之前的一个问题Intent setData 与 Intent putExtra https stackoverflow com que
  • 当前版本的Android Gradle插件不支持按需配置

    升级到 Android Studio 3 1 2 后 出现以下错误 当前版本的 Android Gradle 插件不支持按需配置 因为您使用的是 Gradle 4 6 或更高版本 建议 通过在 gradle properties 文件中设置
  • 如何在Android中访问现有的sqlite数据库?

    到目前为止 我们已经在 Android 中开发了在运行时创建数据库的应用程序 我们想知道如何在 Android 应用程序中访问预构建或现有的数据库 sqlite 文件 请提供详细信息 查看文档android database sqlite
  • 动态地将textView添加到线性布局中

    我在这里的某个地方读过这篇文章 但我完全迷失了 但我需要一些帮助 我的应用程序正在将列名称从 sqlite 拉入数组中 我想创建一个文本视图并为每个视图编辑文本 通过数组的大小 我记得在某处读过 您可以将 textViews 变量名称视为数
  • 该项目可能使用的 Gradle 版本不包含“compileSdkVersion()”方法

    当我尝试运行最初在 Eclipse ADT 上创建的项目时 我遇到了这个问题 Error 17 0 Gradle DSL method not found compileSdkVersion Possible causes ul li Th
  • 数据未刷新“DynamiteModule:未找到 com.google.firebase.auth 的本地模块描述符类”

    我已经使用 Firebase 很长时间了 到目前为止 除了以下场景之外 一切都很好 有时我注意到我的应用程序不再获取新数据 我正在用一个活跃的监听器监听变化 并且我确实有keepSynced set to true 发生这种情况时 我会在日
  • Android 媒体播放器搜索栏

    我有一个创建 播放和处理媒体播放器 只是音频 的服务 但我在主要活动中有一个搜索栏 我想自然地显示音频文件的进度并允许用户搜索到不同的位置 我花了很长时间才弄清楚 将 UI 中的搜索栏连接到服务中的媒体播放器的最佳或正确方法是什么 我将这样
  • 调整 SwipeRefreshLayout 高度,将 View 置于其底部

    I have SwipeRefreshLayout里面一个RelativeLayout 问题是SwipeRefreshLayout占据了屏幕上的所有位置 我需要放置一个视图after这个观点 看图片 https i stack imgur
  • 将触摸事件从 NestedScrollView 传递到父视图

    我在 NestedScrollView 下方有一个 ViewPager 宽度一些顶部填充 以及 ClipToPadding false 和透明背景 如图像 我的 ViewPager 无法获取触摸事件并且无法工作 我怎么解决这个问题 我无法更
  • LinearLayout:防止最后一个孩子被之前的大文本视图推出或挤压

    我有一个LinearLayout里面有两个孩子 第一个是TextView对于动态内容 第二个是一个按钮 我的问题是按钮被推出其父级或被挤压到不再可见的程度 我想要TextView认识到其父母与第二个孩子一起没有更多空间 并开始新的一行 而不
  • 如何从图库动态卸载图像?

    我有自定义 ImageView public class ShadowedImageView extends ImageView private Paint mPaint public Bitmap bitmap null private
  • 如果我的应用程序安装在 SD 卡上,私人数据也在那里吗?

    我假设应用程序的私有数据 例如 SharedPreferences 和 SQLite 数据库 位于手机的内部存储而不是 SD 卡上 即使应用程序本身安装在 SD 卡上 我在任何地方都找不到对此的简单明确的确认 有人可以确认一下吗 是的 私有
  • 按“重置应用程序首选项”后,我的应用程序的所有权限都被撤销

    我开发了一个应用程序 支持Android 6 0 当我在 设置 gt 应用程序 gt 重置应用程序首选项 中重置应用程序首选项时 我的应用程序的所有权限都将被撤销 并且应用程序不会重新启动 撤销权限后未能重新启动应用程序可能会导致许多意外崩
  • 传递 Android DialogFragment 参数时,onCreateDialog 捆绑参数意外为 null

    我正在尝试使用 DialogFragment 在 Android 中显示一个基本对话框 并使用对话框消息的参数 如中所述StackOverflow线程 https stackoverflow com questions 15459209 p
  • Android - 如何简单地拖放按钮?

    我在这里找到了一个适合初学者的教程 http androidrox wordpress com 2011 05 13 android sample app drag and drop image using touch http andro

随机推荐

  • macOS如何查看pkg安装包中的内部文件

    目录 写在前面 安装App 使用 pkg 信息面板 脚本查看 写在前面 macOS如何查看 pkg 安装包中的内部文件 我们在整系统的时候 有的时候需要查看 pkg 的内部文件 本文就教一教大家macOS如何查看 pkg 安装包中的内部文件
  • 设置锚点

    导航栏的定位 document scroll function if document scrollTop gt 442 nav css position fixed background ffffff top 0px z index 10
  • LinuxC文件操作接口

    LinuxC文件操作接口 创建与删除 创建文件 FILE fopen const char filename const char mode int open const char pathname int flags mode t mod
  • python入门之逻辑判断

    目录 一 判断 if 语句 二 逻辑运算 三 if语句进阶 四 综合应用 石头剪刀布 五 循环 一 判断 if 语句 1 判断语句演练 判断年龄 需求 1 定义一个整数变量记录年龄 2 判断是否满18岁 gt 3 如果满18岁 允许进网吧嗨
  • IDEA中测试代码覆盖率(Run with Coverage)插件出错的解决方式

    在进行实验时第一步要求安装测试代码覆盖率的插件时 发现idea上自带了可以直接使用的功能 我们在写好或者导入junit测试代码之后idea会自动帮我们下载junit 配置好相关设置之后就可以运行 正常的直接运行测试代码都可以直接进行但是这个
  • JQuery

    公式 a href 点我 a
  • 基于Node.js的NoSQL产品:FileDB V3.0开发完毕

    FileDB前两版是基于Java和Servlet容器的 且只能现实简单的Key Value数据存取 V3 0版使用了Javascript语言重写代码 并进行了重新设计 运行环境改为了Node js V3 0版功能有所增强 支持建任意多个表
  • SpringBoot在一定时间内限制接口请求次数-接口防刷拦截

    前一篇文字写了springboot的注册登录接口 并且这两个接口是开放的 特别是注册接口为了防止恶意注册 需要设置拦截 需要用到的知识 注解 AOP ExpiringMap 带有有效期的映射 需要自定义注解 把注解添加到我们的接口上 定义一
  • Qt插件机制及加载流程

    简介 插件实际上就是一个个动态库 动态库在不同平台下后缀名不一样 比如在 Windows下以 dll结尾 Linux 下以 so结尾 那么开发插件其实就是开发一个动态库 该动态库能够很好的加载进主程序 访问主程序资源 和主程序之间进行通信
  • k8s-核心实战

    一 资源创建方式 使用命令行 使用yum 二 NameSpace 名称空间 用来对集群资源进行隔离划分 默认只隔离资源 不隔离网络 例如创建开发 测试 生产等命令空间 可以保证一个应用引用配置只能读取自己名称空间内的资源 但是可以访问不同名
  • 悬镜安全宣布完成数千万元Pre-A轮融资

    榜样的力量 数据猿公益策划活动 寻找新冠战 疫 中国数据智能产业先锋力量 申报项目 提交文章 或深度采访 即可参与此次活动最终推出的榜单 勋章 思想者合集以及人物条漫等内容的评选 并有全网超过100家媒体同步扩散传播 丨点击 这里 了解详情
  • 基于微信小程序的医院挂号预约系统

    末尾获取源码 开发语言 Java Java开发工具 JDK1 8 后端框架 SSM 前端 Vue 数据库 MySQL5 7和Navicat管理工具结合 服务器 Tomcat8 5 开发软件 IDEA Eclipse 是否Maven项目 是
  • 双系统安装Win10+Ubuntu18.04超详细教程

    双系统安装Win10 Ubuntu18 04超详细教程 本教程主要内容包括 准备工作 制作U盘 磁盘分区和安装过程 文章目录 双系统安装Win10 Ubuntu18 04超详细教程 一 准备工作 1 1 确认BIOS模式 1 2 确认硬盘数
  • MySql 快速插入千万级大数据

    原文地址 http blog csdn net oldbai001 article details 51693139 在数据分析领域 数据库是我们的好帮手 不仅可以接受我们的查询时间 还可以在这基础上做进一步分析 所以 我们必然要在数据库插
  • CFile::Open的一些使用说明

    CFIIE类是MFC的文件类的基类 它直接提供无缓冲的二进制磁盘I O设备 并且通过它的派生类可以提供对text文件和内存文件的存取 CFILE与CArchive类一起提供对MFC序列化的支持 CFILE类和它的派生类之间的等级关系 允许你
  • 卡尔曼/扩展卡尔曼滤波器的原理及应用

    卡尔曼滤波器的原理及应用 应用前提 算法详细介绍 应用举例 下一步 原文地址 http blog csdn net lizilpl article details 45289541 1 应用前提 要应用kalman Filter 首先要有三
  • Leetcode 88:合并两个有序数组

    题目描述 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2 另有两个整数 m 和 n 分别表示 nums1 和 nums2 中的元素数目 请你 合并 nums2 到 nums1 中 使合并后的数组同样按 非递减顺序 排列
  • 【Linux】查看目录下的文件个数和大小

    文章目录 一 查看某目录下的文件个数 1 查看目录下的文件个数 2 查看指定目录下的文件个数 3 递归查询当前目录下的文件个数 4 递归查询指定目录下的文件个数 二 查看某目录下的文件个数 1 查看当前目录中的文件大小 2 查看指定目录中的
  • 已解决:git push代码出现Support for password authentication was removed on August 13, 2021.

    git push代码时出现如下情况 尝试几次输入用户名密码还是不行 Support for password authentication was removed on August 13 2021 意思是 2021 8月13日 取消了对密
  • 列表多选配合取消和确定以及全选使用

    效果 代码