AlertDialog.Builder实现多选框的全选和反选功能

gyl31016 2013-09-25 05:52:57
多选框有一个全选按钮,需要实现的功能是选中全选则所有选项被选中,取消全选则所有选项被取消
现在的情况是,选中全选可以将所有选项选中,但是取消全选却不能取消所有选项,代码如下

String[] strArr = new String[] { "赵", "钱", "孙", "李", "周", "吴", "郑", "王", "全选" };
boolean[] boolArr = new boolean[strArr.length];

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("多选");
builder.setMultiChoiceItems(strArr, boolArr, new OnMultiChoiceClickListener() {

@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
if (which == strArr.length - 1) { // 点击全选
for (int i = 0; i < boolArr.length; i++) {
boolArr[i] = isChecked;
}
} else {
boolArr[which] = isChecked;
}
}
});
builder.setPositiveButton("确定", null);
builder.setNegativeButton("取消", null);
builder.create().show();
}
});
}
...全文
382 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Max7Chou 2015-03-27
  • 打赏
  • 举报
回复
这个实现了dialog里面的多选全选
AlertDialog builder = new AlertDialog.Builder(this)
				.setTitle("多选框")
				.setMultiChoiceItems(areas, areaState,
						new OnMultiChoiceClickListener() {

							@Override
							public void onClick(DialogInterface dialog,
									int which, boolean isChecked) {
								if (which == 0) {
									for (int i = 1; i < areaState.length; i++) {
										listview.setItemChecked(i, isChecked);
										areaState[i] = isChecked;
									}
								}else {
									areaState[which] = isChecked;
								}
							}
						})
				.setPositiveButton("确定", new DialogInterface.OnClickListener() {
					public void onClick(DialogInterface dialog, int id) {

						// Toast.makeText(getActivity(), "按钮id"+id,
						// Toast.LENGTH_SHORT).show();
						String s = "您选择了:";
						// 扫描所有的列表项,如果当前列表项被选中,将列表项的文本追加到s变量中。

					}
				}).setNegativeButton("取消", null).create();
		listview = builder.getListView();
		builder.show();
qq_21949375 2015-01-30
  • 打赏
  • 举报
回复
for (int i = 0; i < boolArr.length; i++) {
                            boolArr[i] = isChecked;
                        }
这段代码有误吧,这段代码是点击全部处理的逻辑,但是你这个估计ischecked还是为true 你这样判断下看看行不
if(boolArr[strArr.length - 1] ){
     for (int i = 0; i < boolArr.length; i++) {
                            boolArr[i] = true;
                        }

}else{
 
     for (int i = 0; i < boolArr.length; i++) {
                            boolArr[i] = false;
                        }

}
________________________________________________________________________________________________ c#.net qrcode creator.net barcode
gyl31016 2013-09-26
  • 打赏
  • 举报
回复
搞定了 http://www.eoeandroid.com/forum.php?mod=viewthread&tid=199941&_dsign=ee3d1880
踩踩一哥 2013-09-26
  • 打赏
  • 举报
回复
引用 2 楼 gyl31016 的回复:
[quote=引用 1 楼 tantahe 的回复:]
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
    boolean state = false;//用来标识有没有全选,已经全选则为true
    if (which == strArr.length - 1) { // 点击全选
        for (int i = 0; i < boolArr.length; i++) {
            if (state){
                boolArr[i] = false;
            } else {
                boolArr[i] = true;
            }
            state = !state;
        }
    } else {
        boolArr[which] = isChecked;
    }
}
onClick()改了一下。主要是这里的逻辑有点不对,还不行的话你就自己调一下,重点关注isChecked是true还是false。
我改成
if (which == strArr.length - 1) { // 点击全选
							isAllChecked = !isAllChecked;
							for (int i = 0; i < boolArr.length; i++) {
								if (isAllChecked) {
									boolArr[i] = true;
								} else {
									boolArr[i] = false;
								}
							}
						} else {
							boolArr[which] = isChecked;
						}
boolean isAllChecked是成员变量,还是不行,debug看过,全选是true的时候,boolArr[]的每一项都是true,全选是false的时候,boolArr[]的每一项都是false,但是true的时候,每一个checkbox都会被打钩,而false的时候只有全选的checkbox的钩被去掉了,其他checkbox的钩还在[/quote] 全选的时候不是都打钩了吗? 如果不是的话这里你的逻辑就不该这么写 if (which == strArr.length - 1) { // 点击全选 else { boolArr[which] = isChecked; } 点击取消所有选项的时候 将设置不选的代码放到全选外面。
gyl31016 2013-09-26
  • 打赏
  • 举报
回复
引用 1 楼 tantahe 的回复:
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
    boolean state = false;//用来标识有没有全选,已经全选则为true
    if (which == strArr.length - 1) { // 点击全选
        for (int i = 0; i < boolArr.length; i++) {
            if (state){
                boolArr[i] = false;
            } else {
                boolArr[i] = true;
            }
            state = !state;
        }
    } else {
        boolArr[which] = isChecked;
    }
}
onClick()改了一下。主要是这里的逻辑有点不对,还不行的话你就自己调一下,重点关注isChecked是true还是false。
我改成
if (which == strArr.length - 1) { // 点击全选
							isAllChecked = !isAllChecked;
							for (int i = 0; i < boolArr.length; i++) {
								if (isAllChecked) {
									boolArr[i] = true;
								} else {
									boolArr[i] = false;
								}
							}
						} else {
							boolArr[which] = isChecked;
						}
boolean isAllChecked是成员变量,还是不行,debug看过,全选是true的时候,boolArr[]的每一项都是true,全选是false的时候,boolArr[]的每一项都是false,但是true的时候,每一个checkbox都会被打钩,而false的时候只有全选的checkbox的钩被去掉了,其他checkbox的钩还在
tantahe 2013-09-25
  • 打赏
  • 举报
回复
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
    boolean state = false;//用来标识有没有全选,已经全选则为true
    if (which == strArr.length - 1) { // 点击全选
        for (int i = 0; i < boolArr.length; i++) {
            if (state){
                boolArr[i] = false;
            } else {
                boolArr[i] = true;
            }
            state = !state;
        }
    } else {
        boolArr[which] = isChecked;
    }
}
onClick()改了一下。主要是这里的逻辑有点不对,还不行的话你就自己调一下,重点关注isChecked是true还是false。

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧