Android ExpandableListView 复选框选择仅单击的复选框

2024-04-05

我有一个简单的问题ExpandableListViews并使用CheckBoxes。我将在下面显示当前的代码。我目前有一个ExpandableListView每个子行中都有一个复选框。

These checkboxes可以选择等等,但问题是我有很多孩子ExpandableListView。所以问题是,当我选中一个复选框时,它显示选中了多个复选框。因此,如果我选中第一个子复选框,它还会显示第 6 个或第 7 个子节点也被选中。

package com.WebGems.MW3CustomClasses;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import android.app.Activity;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.ExpandableListView;
import android.widget.ExpandableListView.OnChildClickListener;
import android.widget.ImageView;
import android.widget.SimpleExpandableListAdapter;
import android.widget.TextView;

public class PrimaryWeapon extends Activity {
    ExpandableListView listPrimaryWeapon;


    //Strike Package ArrayLists

    ArrayList assaultPackage = new ArrayList();




    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.primary_weapon);
        listPrimaryWeapon = (ExpandableListView)findViewById(R.id.listView1);

        Bundle extras = getIntent().getExtras();
        String type = extras.getString("type");


        if(type.equals("assault")) {
            showAssaultPackageList();
        }


    }
    private void showAssaultPackageList() {
        // TODO Auto-generated method stub

        assaultPackage.add("UAV");
        assaultPackage.add("CARE PACKAGE");
        assaultPackage.add("I.M.S.");
        assaultPackage.add("PREDATOR MISSILE");
        assaultPackage.add("SENTRY GUN");
        assaultPackage.add("PRECISION AIRSTRIKE");
        assaultPackage.add("ATTACK HELICOPTER");
        assaultPackage.add("STRAFE RUN");
        assaultPackage.add("AH-6 OVERWATCH");
        assaultPackage.add("REAPER");
        assaultPackage.add("ASSAULT DRONE");
        assaultPackage.add("AC-130");
        assaultPackage.add("PAVE LOW");
        assaultPackage.add("JUGGERNAUT");
        assaultPackage.add("OSPREY GUNNER");



        // Construct Expandable List
        final String NAME = "name";
        final String IMAGE = "image";
        final String DATA = "data";
        final String NUMBER = "number";

        final LayoutInflater layoutInflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        final ArrayList<HashMap<String, String>> headerData = new ArrayList<HashMap<String, String>>();

        final HashMap<String, String> group1 = new HashMap<String, String>();
        group1.put(NAME, "Assault Package");
        headerData.add( group1 );

        final ArrayList<ArrayList<HashMap<String, Object>>> childData = new ArrayList<ArrayList<HashMap<String, Object>>>();

        final ArrayList<HashMap<String, Object>> group1data = new ArrayList<HashMap<String, Object>>();
        childData.add(group1data);

        int assaultPackageCounter = 0;
        for(int arm = 0; arm < assaultPackage.size(); ++arm) {
            final HashMap<String, Object> assaultPackageMap = new HashMap<String, Object>();
            assaultPackageMap.put(NAME, assaultPackage.get(arm));
            if(assaultPackageCounter == 0) {
                assaultPackageMap.put(IMAGE, getResources().getDrawable(R.drawable.uav));
                assaultPackageMap.put(DATA, "UAV DESCRIPTION");
                assaultPackageMap.put(NUMBER, getResources().getDrawable(R.drawable.three));
            }
            if(assaultPackageCounter == 1) {
                assaultPackageMap.put(IMAGE, getResources().getDrawable(R.drawable.carepackage));
                assaultPackageMap.put(DATA, "CARE PACKAGE DESCRIPTION");
                assaultPackageMap.put(NUMBER, getResources().getDrawable(R.drawable.four));
            }
            if(assaultPackageCounter == 2) {
                assaultPackageMap.put(IMAGE, getResources().getDrawable(R.drawable.ims));
                assaultPackageMap.put(DATA, "IMS DESCRIPTION");
                assaultPackageMap.put(NUMBER, getResources().getDrawable(R.drawable.five));
            }
            if(assaultPackageCounter == 3) {
                assaultPackageMap.put(IMAGE, getResources().getDrawable(R.drawable.predatormissile));
                assaultPackageMap.put(DATA, "PREDATOR MISSILE DESCRIPTION");
                assaultPackageMap.put(NUMBER, getResources().getDrawable(R.drawable.five));
            }
            if(assaultPackageCounter == 4) {
                assaultPackageMap.put(IMAGE, getResources().getDrawable(R.drawable.sentrygun));
                assaultPackageMap.put(DATA, "SENTRY GUN DESCRIPTION");
                assaultPackageMap.put(NUMBER, getResources().getDrawable(R.drawable.five));
            }
            if(assaultPackageCounter == 5) {
                assaultPackageMap.put(IMAGE, getResources().getDrawable(R.drawable.precisionairstrike));
                assaultPackageMap.put(DATA, "PRECISION AIRSTRIKE DESCRIPTION");
                assaultPackageMap.put(NUMBER, getResources().getDrawable(R.drawable.six));
            }
            if(assaultPackageCounter == 6) {
                assaultPackageMap.put(IMAGE, getResources().getDrawable(R.drawable.attackhelicopter));
                assaultPackageMap.put(DATA, "ATTACK HELICOPTER DESCRIPTION");
                assaultPackageMap.put(NUMBER, getResources().getDrawable(R.drawable.seven));
            }
            if(assaultPackageCounter == 7) {
                assaultPackageMap.put(IMAGE, getResources().getDrawable(R.drawable.straferun));
                assaultPackageMap.put(DATA, "STRAFE RUN DESCRIPTION");
                assaultPackageMap.put(NUMBER, getResources().getDrawable(R.drawable.nine));
            }
            if(assaultPackageCounter == 8) {
                assaultPackageMap.put(IMAGE, getResources().getDrawable(R.drawable.ahsixoverwatch));
                assaultPackageMap.put(DATA, "AH-6 OVERWATCH DESCRIPTION");
                assaultPackageMap.put(NUMBER, getResources().getDrawable(R.drawable.nine));
            }
            if(assaultPackageCounter == 9) {
                assaultPackageMap.put(IMAGE, getResources().getDrawable(R.drawable.reaper));
                assaultPackageMap.put(DATA, "REAPER DESCRIPTION");
                assaultPackageMap.put(NUMBER, getResources().getDrawable(R.drawable.nine));
            }
            if(assaultPackageCounter == 10) {
                assaultPackageMap.put(IMAGE, getResources().getDrawable(R.drawable.assaultdrone));
                assaultPackageMap.put(DATA, "ASSAULT DRONE DESCRIPTION");
                assaultPackageMap.put(NUMBER, getResources().getDrawable(R.drawable.ten));
            }
            if(assaultPackageCounter == 11) {
                assaultPackageMap.put(IMAGE, getResources().getDrawable(R.drawable.aconethreezero));
                assaultPackageMap.put(DATA, "AC-130 DESCRIPTION");
                assaultPackageMap.put(NUMBER, getResources().getDrawable(R.drawable.twelve));
            }
            if(assaultPackageCounter == 12) {
                assaultPackageMap.put(IMAGE, getResources().getDrawable(R.drawable.pavelow));
                assaultPackageMap.put(DATA, "PAVE LOW DESCRIPTION");
                assaultPackageMap.put(NUMBER, getResources().getDrawable(R.drawable.twelve));
            }
            if(assaultPackageCounter == 13) {
                assaultPackageMap.put(IMAGE, getResources().getDrawable(R.drawable.juggernaut));
                assaultPackageMap.put(DATA, "JUGGERNAUT DESCRIPTION");
                assaultPackageMap.put(NUMBER, getResources().getDrawable(R.drawable.fifteen));
            }
            if(assaultPackageCounter == 14) {
                assaultPackageMap.put(IMAGE, getResources().getDrawable(R.drawable.ospreygunner));
                assaultPackageMap.put(DATA, "OSPREY GUNNER DESCRIPTION");
                assaultPackageMap.put(NUMBER, getResources().getDrawable(R.drawable.seventeen));
            }
            assaultPackageCounter++;
            group1data.add(assaultPackageMap);
        }
        assaultPackageCounter = 0;

        // Set up some sample data in both groups
        /*for( int i=0; i<10; ++i) {
            final HashMap<String, Object> map = new HashMap<String,Object>();
            map.put(NAME, "Child " + i );
            //map.put(DATA, "Data " + i);
            map.put(IMAGE, getResources().getDrawable((i%3==0? R.drawable.arrowright : R.drawable.arrowdown)));
            ( i%2==0 ? group1data : group2data ).add(map);
        }*/

        listPrimaryWeapon.setAdapter( new SimpleExpandableListAdapter(
                this,
                headerData,
                R.layout.group_row,
                new String[] { NAME, DATA },    // the names of the data
                new int[] { R.id.groupname },   // the text field to populate with the field data
                childData,
                0,
                null,
                new int[] {}
            ) {
                @Override
                public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
                    final View v = super.getChildView(groupPosition, childPosition, isLastChild, convertView, parent);

                    // Populate your custom view here
                    ((TextView)v.findViewById(R.id.name)).setText( (String) ((Map<String,Object>)getChild(groupPosition, childPosition)).get(NAME) );
                    ((TextView)v.findViewById(R.id.textView1)).setText( (String) ((Map<String,Object>)getChild(groupPosition, childPosition)).get(DATA) );
                    ((ImageView)v.findViewById(R.id.image)).setImageDrawable( (Drawable) ((Map<String,Object>)getChild(groupPosition, childPosition)).get(IMAGE) );
                    ((ImageView)v.findViewById(R.id.imageView1)).setImageDrawable( (Drawable) ((Map<String,Object>)getChild(groupPosition, childPosition)).get(NUMBER) );
                    CheckBox cb = (CheckBox)v.findViewById( R.id.checkBox1 );
                    cb.setClickable(false);
                    return v;
                }

                @Override
                public View newChildView(boolean isLastChild, ViewGroup parent) {
                     return layoutInflater.inflate(R.layout.strikepackagelayout, null, false);
                }
            }
        );
        ExpandableListView list = (ExpandableListView) findViewById(R.id.listView1);
        list.setChoiceMode(ExpandableListView.CHOICE_MODE_MULTIPLE);
        list.setOnChildClickListener(new OnChildClickListener(){
            public boolean onChildClick(ExpandableListView parent, View v,
                    int groupPosition, int childPosition, long id) {
                CheckBox cb = (CheckBox)v.findViewById( R.id.checkBox1 );
                if(cb != null){
                    cb.toggle();
                }
                Log.d("type", "Group: " + groupPosition + ", Child: " + childPosition);
                System.out.println("Group:"+groupPosition+", Child: "+childPosition);
                return true;
            }
        });
        listPrimaryWeapon.expandGroup(0);




    }
}

作为可扩展列表视图 每次移动时回收视图。所以你需要保存每个视图的状态。

1> 为每个复选框设置不同的 id。类似的东西 checkBox.setId(groupPosition + 1);

2> 将选定的复选框 ID 添加到哈希映射对象,例如

checkBox.setOnCheckedChangeListener(
new CompoundButton.OnCheckedChangeListener() {

                                    @Override
                                    public void onCheckedChanged(if (checkBox.isChecked()) {
                                            mapViewState.put(checkBox.getId(),
                                                    checkBoxSelected);
                                        } else {
                                            mapViewState.remove(checkBox
                                                    .getId());
                                        }

                                    }
                                });

然后从 HashMap 加载复选框的状态,或者迭代它以获取选定的值。

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

Android ExpandableListView 复选框选择仅单击的复选框 的相关文章

随机推荐

  • 如何撤消 Angular 2 Cli ng-eject?

    我刚刚执行了ng eject命令 但现在我需要恢复它 并继续使用ng命令 是否可以 我将不胜感激任何帮助 At https github com angular angular cli blob master packages 40angu
  • 如何获取给定字体文件的字体系列的名称?

    我有一组文件名不可预测的字体文件 因此我无法从文件名中推断出真正的 字体系列 名称 因此 我需要读取字体元数据以提取真正的 字体系列 名称 以便渲染此字体文件 我使用的是 C NET 4 0 WinForms 我见过这个功能GetFontI
  • 如何将日期选择器最大日期限制为今天? [复制]

    这个问题在这里已经有答案了 问题就在标题里 我有两个日期选择器 从和到 我想将日期选择器限制为当前日期 我怎么做 提前致谢 使用 maxDate 选项 http jqueryui com demos datepicker option ma
  • 如何处理 Web API 中的可选查询字符串参数

    我正在编写一个 Web API 我希望了解处理可选查询字符串参数的最佳方法是什么 我有一个定义如下的方法 HttpPost public HttpResponseMessage ResetPassword User user var que
  • SQL Server 加权全文搜索

    目前 我有一个表 可以在 4 个字段 名字 姓氏 中间名和别名 上搜索 我目前有一个包含稳定搜索行并且它有效 不太好 但它有效 现在我想让名字的权重更高 中间名的权重更低 我找到了命令ISABOUT但如果我必须通过文字而不是专栏来完成它 那
  • 无法在基于 JHipster 的 Web 应用程序中运行从 Gradle BootRepackage 生成的 war

    我正在尝试与java jar生成的war文件 gradlew Pprod bootRepackage The bootRepackage任务成功结束 当我看着project root build libs 文件夹中 war 和 war or
  • 在 postgresql 中搜索数组中的元素而不使用循环

    我正在编写一个查询来搜索数组中的元素 使用 for 循环搜索效率不高 因为我的数组有很多元素 因此 查询需要花费大量时间来执行 那么任何人都可以说如何在没有 for 循环的情况下搜索数组中的元素 这应该更快 我必须获取搜索索引 谢谢 卡西卡
  • 如何修改内核DTB文件

    Summary 我目前正在为定制板编译 Linux 内核 内核 模块和 DTB 以及一些定制驱动程序 有时 我会编译内核并意识到 DTB 文件中的兼容性字符串不是自定义驱动程序正在寻找的内容 现在 我可以解决此问题的唯一方法是修改 DTS
  • 我想我需要一个简单的规则引擎? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 UINavigationController 上推送多个视图控制器时出现内存问题

    我正在为 iPad 制作一本互动书 并且正在使用UINavigationController实现页面与下一页之间的导航 当用户翻页时 下一页被推送到导航堆栈的顶部 我现在已经进入应用程序的 15 页 当我尝试从第 14 页转到第 15 页时
  • 如何重命名 Oracle 过程

    有没有一种方法可以重命名 Oracle 过程 而不必删除并重新创建该过程 不幸的是 没有等效的ALTER TABLE RENAMETO 用于 PL SQL 对象 所以恐怕您将不得不放弃该过程并使用新名称重新创建它 除非使用 SYNONYM
  • RxJava + 改造,获取列表并为每个项目添加额外信息

    我正在玩 RXJava 在 Android 中进行改造 我正在努力完成以下任务 我需要定期轮询一个给我 Observable gt 的调用 从这里我可以做到 一旦我得到这个列表 我想在每个交付中迭代并调用另一个方法来给我预计到达时间 所以只
  • 将“this”传递给 onclick 事件[重复]

    这个问题在这里已经有答案了 可能的重复 当前元素作为其事件函数参数 https stackoverflow com questions 4268085 the current element as its event function pa
  • 数组和结构体可以以不同的方式初始化吗?

    我的问题可能看起来很奇怪 事实上 这是上下文 我目前在切换时遇到一个奇怪的问题 关于我正在从事的项目 核心从pullinino到CV32 也发生了一些其他变化 例如关于crt0 如一些数据内存重置 这是一个 真实的 例子 说明了一个非常简单
  • asp.net 从内容页面更改母版页部分 css

    我的母版页中有以下代码 div div
  • 在 PHP 中为用户创建 CSV 文件

    我在 MySQL 数据库中有数据 我向用户发送一个 URL 以将他们的数据以 CSV 文件形式输出 我已经通过电子邮件发送了链接 MySQL 查询等 当他们点击链接时 我怎样才能弹出一个窗口来下载带有 MySQL 记录的 CVS 我已经掌握
  • 我可以在异步函数的 try/catch 块中使用多个“await”吗?

    i e async asyncfunction try await method1 await method2 catch error console log error 给定 method1 和 method2 是异步函数 每个await
  • 内核源码位置在Buildroot中

    我是 Buildroot 的新人 我有 P2041RDB NXP 板的 Linux 内核源代码 那么我应该将其放置在哪里以及如何在配置中设置此位置 目前无法从 Buildroot 配置中设置内核源代码的路径 您有两种选择 创建文件local
  • 将 ☺ 编码为 IBM-437 失败,而将 é 等其他有效字符编码成功

    gt gt gt bytes ibm437 Traceback most recent call last File
  • Android ExpandableListView 复选框选择仅单击的复选框

    我有一个简单的问题ExpandableListViews并使用CheckBoxes 我将在下面显示当前的代码 我目前有一个ExpandableListView每个子行中都有一个复选框 These checkboxes可以选择等等 但问题是我