以下代码可以创建一个简便的复选框。
boolean[] isCheckCache = new boolean[5];
String[] nameStrings = {"选项1","选项2","选项3","选项4","选项5",};
new AlertDialog.Builder(getActivity())
.setTitle("复选框").setMultiChoiceItems(nameStrings, isCheckCache, new MyonMultiChoiceClickListener())
.setPositiveButton("确定", new MyDiaglogOnClickPositiveListener())
.setNegativeButton("取消", new MyDiaglogOnClickNegativeListener())
.show();
其中,isCheckCache[]是一个boolean[],用来记录各个选项的值。
只要你点击了这个多选框的选项,isCheck[which]就会改变值---这些操作是固定的,一定会执行。无论你的监听器MyonMultiChoiceClickListener()是否为Null,监听器的代码写了什么。
关于这点,我查了很久,实在查不到这些操作的源头在哪,但应该是在源码里,具体应该是AlertController里。
这样一来,确定键就没用了,因为无论我是否点击确定键,只要点击了选项,就会改变值。取消键同时也没了作用,没办法去取消做过的操作。
仔细一想,就会发现,少了一个值,一个缓存值,操作的应该是缓存值,最后再把缓存值赋予给真的boolean[]数组里才对。那样的话,如果我要取消这个操作直接就不把缓存存过去就好了。
缓存boolean[] 就叫 isCheckCache[],真正要保存的boolean[ ]就叫 isCheck[] 。
接下来,让我们试想一下,我点击了第一个选项,但是我按了取消,情况会怎样?
isCheckCache[0] =true ;
isCheck[0] = false;
对吧?
然后我再点开这个多选框,显示的不是isCheck[],而是isCheckCache[],第一个选项已经打勾了。
因为setMultiChoiceItems(nameStrings, isCheckCache, new MyonMultiChoiceClickListener()),这行代码里,我绑定的是isCheckCache[],所以,多选选项是isCheckCache[]的。
所以,我们就要想办法让多选框的选项显示isCheck[],在打开复选框的之前,先把isCheck的值赋给isCheckCache[]就好了嘛。
isCheckCache = isCheck;
好了,到了这里,我想说的漏洞就来了:
无论是哪个boolean[],只要赋值给了要绑定的boolean[],它的值也会变!
在这个例子里,isCheck就会跟着isCheckCache,在点击选项的时候一起改变---isCheck和isCheckCache一样,那就会失去缓存的意义。
那好吧,我中间再隔一个isCheck2[]试试吧。
isCheck2[] = isCheck[];
isCheckCache = isCheck2[];
悲剧的是,不论你中间经过多少个值,就算十个isCheck[]都会一起改变值。
行!我还有一招:我建一个类CheckTest,把isCheck[]放进去,private之,设置set和get:
class CheckTest{
private boolean[] isCheck;
public boolean[] getIsCheck(){
return isCheck;
}
public void setIsCheck(boolean[] isCheck){
this.isCheck = isCheck;
}
}
然后我在确定键的监听方法 MyDiaglogOnClickPositiveListener() 里把值赋过去,总行了吧!
不行!!!!!还是不行!!
这就是JAVA的引用问题。
使用clone()方法就好了。
脑子抽了,竟然没想到。