带有全选复选框的可扩展列表视图:组项目单击和滚动错误

2023-12-02

我有一个 ExpandableListView,组名称旁边有一个复选框,展开时,子项目也带有复选框。

假设我有 4 个组,有 50 个孩子。当展开一个组时,我单击全选复选框,一切正常,所有复选框都被选中,并在滚动时保持其状态。

但是,如果我滚动直到列表的最后一个子项,则滚动会出现错误(滚动到顶部然后触摸屏幕以停止滚动不再起作用),单击组也不再起作用,直到我再次单击全选复选框。 单击子复选框不会执行任何操作,我必须单击全选复选框才能使所有内容正常工作。

我更改了子复选框、组复选框的可聚焦状态并尝试了很多方法,但我找不到解决方案。你知道它来自哪里吗?

public class ExpandableListAdapter extends BaseExpandableListAdapter {


    LayoutInflater cinflater;
    LayoutInflater ginflater;
    ArrayList<Group> array;
    Context context;


    public ExpandableListAdapter(Context context, ArrayList<Group> array) {
        super();

        cinflater = LayoutInflater.from(context);
        ginflater = LayoutInflater.from(context);

        this.array = array;
        this.context = context;

    }


    public class ChildViewHolder {

        CheckBox contactcheckbox;
        TextView name;

    }


    @Override
    public int getChildrenCount(int groupPosition) {
        // TODO Auto-generated method stub
        return array.get(groupPosition).getContacts().size();
    }


    private OnCheckedChangeListener contactchecklistener = new OnCheckedChangeListener() {
               @Override
               public void onCheckedChanged(CompoundButton checkboxView, boolean isChecked) {

                   Contact contact = (Contact) checkboxView.getTag();
                   contact.setCheck(isChecked);

               }

            };

    @Override
    public View getChildView(int groupPosition, int childPosition,
            boolean isLastChild, View convertView, ViewGroup parent) {

        ChildViewHolder cholder;

        if(convertView == null){

            cholder = new ChildViewHolder();

            convertView = cinflater.inflate(R.layout.childsitems, null);

            cholder.name = (TextView) convertView.findViewById(R.id.childnametextview);

            cholder.contactcheckbox = (CheckBox) convertView.findViewById(R.id.childcheckbox);
            cholder.contactcheckbox.setOnCheckedChangeListener(contactchecklistener);


            convertView.setTag(cholder);

        }else{

            cholder = (ChildViewHolder) convertView.getTag();

        }

        cholder.contactcheckbox.setTag(array.get(groupPosition).getContacts().get(childPosition));
        cholder.contactcheckbox.setChecked(array.get(groupPosition).getContacts().get(childPosition).isCheck());

        cholder.name.setText(array.get(groupPosition).getContacts().get(childPosition).getName());

        return convertView;
    }



    public class GroupViewHolder {
        TextView groupname;
        CheckBox groupcheck;

    }


    @Override
    public int getGroupCount() {
        // TODO Auto-generated method stub
        return array.size();
    }

    private OnCheckedChangeListener groupchecklistener = new OnCheckedChangeListener() {

        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

            int index = (Integer) buttonView.getTag();

            for(int i = 0;i<array.get(index).getContacts().size();i++){
                array.get(index).getContacts().get(i).setCheck(isChecked);
            }

            array.get(index).setCheck(isChecked);

            notifyDataSetChanged();

        }
    };


    @Override
    public View getGroupView(int groupPosition, boolean isExpanded,
            View convertView, ViewGroup parent) {


        GroupViewHolder gholder;

        if(convertView==null){
            gholder =  new GroupViewHolder();
            convertView = ginflater.inflate(R.layout.groupsitems,null);

            gholder.groupname = (TextView)convertView.findViewById(R.id.groupnametextview);
            gholder.groupcheckbox = (CheckBox)convertView.findViewById(R.id.groupcheckbox);
            gholder.groupcheckbox.setOnCheckedChangeListener(groupchecklistener);

            convertView.setTag(gholder);

        }else{
            gholder = (GroupViewHolder)convertView.getTag();
        }

        gholder.groupname.setText(array.get(groupPosition).getGroupname());
        gholder.groupname.setTextSize(24);
        gholder.groupname.setTextColor(Color.parseColor("#FF858585"));
        gholder.groupname.setTypeface(Typeface.DEFAULT, Typeface.BOLD);

        int paddingleft = 48;  // 38 dps
        final float scale = getResources().getDisplayMetrics().density;
        int dpvalue = (int) (paddingleft * scale + 0.5f);
        gholder.groupname.setPadding(dpvalue, 16, 0, 16);


        gholder.groupcheckbox.setTag(groupPosition);
        gholder.groupcheckbox.setChecked(array.get(groupPosition).isCheck());

        if(isExpanded == true){
                  convertView.setBackgroundDrawable(getResources().getDrawable(R.drawable.expandedbackground));
        }else{
            convertView.setBackgroundColor(Color.TRANSPARENT);
        }

        return convertView;
    }





    @Override
    public Object getChild(int groupPosition, int childPosition) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public long getChildId(int groupPosition, int childPosition) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public Object getGroup(int groupPosition) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public long getGroupId(int groupPosition) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public boolean hasStableIds() {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        // TODO Auto-generated method stub
        return false;
    }

}

组站点.xml:

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent" >


    <CheckBox
        android:id="@+id/groupcheckbox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:layout_marginTop="12dp"
        android:focusable="false"
        android:gravity="right|center"
        android:paddingRight="10dp" />

<TextView
android:id="@+id/groupnametextview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_toLeftOf="@+id/groupcheckbox"
android:focusableInTouchMode="false"
android:text="Large Text"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textColor="#FF858585"
android:textStyle="bold" />

</RelativeLayout>

子项目.xml:

<RelativeLayout
    android:id="@+id/relativeLayout1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="8dp"
    android:layout_marginTop="8dp"
    android:paddingLeft="8dp" >


<TextView
        android:id="@+id/childnametextview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_toRightOf="@+id/childcheckbox"
        android:gravity="right|center"
        android:paddingLeft="16dp"
        android:textColor="#FFAFAFAF"
        android:textSize="16sp"
        android:textStyle="bold" />

<CheckBox
        android:id="@+id/childcheckbox"
        android:layout_width="48dp"
        android:layout_height="48dp"
        android:layout_alignParentLeft="true"
        android:layout_centerVertical="true" />

</RelativeLayout>


我找到了解决方案。我没有在 groupcheckbox 上使用 OnCheckedChangeListener,而是使用 OnClickListener,它解决了如下所有问题:

gholder.groupcheckbox.setChecked(array.get(groupPosition).isCheck());
gholder.groupcheckbox.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

                for(int i = 0;i<array.get(groupPosition).getContacts().size();i++){
                    array.get(groupPosition).getContacts().get(i).setCheck(gholder.groupcheckbox.isChecked());
                }

                array.get(groupPosition).setCheck(gholder.groupcheck.isChecked());

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

带有全选复选框的可扩展列表视图:组项目单击和滚动错误 的相关文章

  • 在解决依赖关系之前运行 gradle 任务

    我想运行一个 gradle 任务 在 gradle 尝试解决依赖关系之前获取其他源并设置它们 在 build gradle 中有一个任务 用于获取子项目的源代码 该任务需要在 Gradle 尝试解决依赖关系之前运行 因为子项目是依赖关系的一
  • Android-ListView-performItemClick

    当我尝试使用时遇到一些困难执行项目单击ListView 的功能 我想要做的就是以编程方式在列表的第一项中执行单击 我怎样才能做到这一点 我在文档中查找了该函数 但我并不真正理解它的参数 我尝试过类似的事情 myListView perfor
  • Android - 手机锁定时执行操作

    我想知道如何在手机锁定时执行某些操作 或继续侦听传感器或电池更换事件 当手机锁定时 它会停止监听传感器的变化 我尝试过使用唤醒锁 但它不起作用 也许我使用错误 任何帮助 将不胜感激 我建议为此使用服务 即使手机被锁定 它们也会在后台运行 这
  • 在 Android 中从互联网链接获取数据

    我正在制作一个带有 URL 的应用程序 asp 扩展名 我们向其传递所需的参数并使用 POST 方法获取一些字符串结果 关于如何实现这一目标有什么建议吗 UPDATED 实际上我有一个 net 链接 它接受一些 POST 参数并给我一个结果
  • XAMARIN - 添加来自 youtube 的视频

    我搜索如何从 youtube 添加视频的信息 例如 我想从一些 YouTube 链接添加视频 我认为它应该在网络视图中 但我需要一些详细信息 因为我找不到有关我的问题的任何信息 您可以使用 webview 播放 youtube 视频 str
  • Android:NotificationCompat.MediaStyle 操作按钮不执行任何操作

    我有一个简单的 Android 应用程序 其中包含一个Activity and a Service源自于MediaBrowserServiceCompat 我已成功将其设置为通过使用播放我的主要活动中的音频MediaBrowserCompa
  • Android 上 Java 库中的代码出现 NoClassDefFoundError

    我的用户经常遇到错误 应用程序在启动期间崩溃 当应该加载 MainActivity 时 VM 显然找不到该类 我不明白为什么 该应用程序的架构是 我的免费版和专业版都使用一个通用项目 不知道是否相关 请参阅下面的堆栈跟踪 有什么想法吗 ja
  • 按钮上方带有文本的单选按钮

    我是 Android 新手 我需要在我的活动中添加单选按钮 但我需要将文本放在项目符号按钮的顶部 请提供任何帮助 我发现了以下内容 尽管我不明白 drawable in 选择器和 style Tab 样式是什么 顶部带有文本的单选按钮 ht
  • 不同风格的模块文件

    我正在尝试在同一个应用程序中实现播放服务和华为服务 但希望能够按风格配置使用哪一个 每种风格都使用自己的 applicationIdSuffix 因此 对于每种不同的风格 华为插件都会失败 我无法编译 我的应用程序模块包含agconnect
  • 获取包含位图支持的画布的 Android 视图上的点的像素颜色值

    我正在尝试找出获取给定点上像素颜色值的最佳方法View http developer android com reference android view View html 我可以通过三种方式写入视图 我设置了背景图像View setBa
  • 带有内容提供商的小部件;无法使用ReadPermission?

    所以我刚刚为我的应用程序实现了一个小部件 它通过我的数据库从数据库获取数据ContentProvider 我在清单中定义了自己的读 写权限 声明我使用它们 似乎没有什么区别 并在内容提供程序中要求它们
  • 如何编写 adb jdwp + adbforward 脚本?

    我正在尝试使用命令行和脚本工具调试 Android 应用程序 我已经受够了 Android Studio 占用我的 CPU 要连接到我的应用程序 我需要adb jdwp获取 pid 然后adb forward tcp 8700 jdwp
  • Eclipse Android 模拟器 - 键盘不工作

    我刚刚更新到最新的 SDK 版本 16 使用最新版本的 API 16 创建了新版本的 AVD 并且我的硬件键盘在模拟器上不再工作 甚至我的其他 avd 使用旧版本的 sdk 任何想法如何解决这一问题 您的 AVD 的 键盘支持 硬件属性是否
  • 如何从Android webview下载文件?

    我下面的代码可以很好地加载 url 页面 并且在搜索歌曲后 当我单击下载链接时 它崩溃了 关于如何让下载管理器与网络视图一起工作的教程并不多 我究竟做错了什么 import java io File import android app A
  • 使用磁场计算旋转矩阵

    在获取旋转矩阵值时它包含public static boolean getRotationMatrix float R float I float gravity float geomagnetic 这里我如何计算float gravity
  • 尝试重新打开已关闭的对象:sqlitequery

    所以本质上我查询数据库两次 我不明白这个错误真正来自哪里 因为我没有在任何地方关闭数据库 返回错误的代码是这样运行的 我查了一下 刚刚看到一个像我这样的案例 BeaconHandler pullAllDB new BeaconHandler
  • 如何在 Android 中不使用 Intent 裁剪图像

    我正在尝试裁剪图像我使用了下面的代码 意图 i new Intent Intent ACTION PICK android provider MediaStore Images Media EXTERNAL CONTENT URI i pu
  • 使用Android Camera API,拍摄照片的方向始终未定义

    我使用相机API 拍摄的照片总是旋转90度 我想旋转它 所以首先我想知道图片的方向 这一点我被卡住了 我总是以两种方式得到未定义的方向 这是代码 Override public void onPictureTaken byte data C
  • 如何以相同的意图从相机获取全尺寸图片和缩略图

    我一直需要找到这个问题的解决方案 我已经从这个社区搜索并测试了许多解决方案 但任何人都适合帮助我 我有两个活动 第一个活动拍摄一张照片并将其发送到另一个活动 该活动有一个 ImageView 来接收该照片 直到这里我遇到问题 以及一个在数据
  • Android 使用不同的签名密钥更新市场应用程序

    开发人员使用他的个人密钥库签署了应用程序 但它应该是公司的密钥库 现在是否可以使用公司的密钥库更新市场中的应用程序 并且仍然可以简化对用户的更新 这有什么后果吗 不可以 您必须将该应用程序作为新应用程序发布到市场上 这次是用公司的key签名

随机推荐