针对使用SharedPreferences来保存数据令列表中checkbox所造成的混乱状态


为什么要用SharedPreferences来保存参数,当只需要保存单一数据可以考虑它.

例子场景,开机后从应用MainActivty启动一个之前选择的导航应用,导航应用列表界面ListAcitity实现对所有导航应用进行单选,选择某个导航应用的app后,下次开机启动主应用时,就启动之前选择的导航并显示。

这种情况,或许很多人会选择其他更好的方法,比如将导航列表每个应用和选择状态保存在数据库里,下次启动主应用时,直接从数据库读取来使用和显示checkbox状态,这是个普遍考虑的方法,但是我会想,从开始到结束我只需要知道当前选择的是哪个应用的包名或者是名字,其他数据或者会用不到,于是我考虑用上SharedPreferences来保存当前的导航应用包名,这也许是个愚蠢的方法,但是也许会有人考虑这样做,特别是初级学者或者比较懒不想写数据库的人.

如果用数据库保存checkbox状态和应用名,那是多对多的关系,若果用SharedPreferences来保存应用名,那是一对一关系,它只需保存当前应用名,而且可以为null.


但是当我们用SharedPreferences来处理保存参数时,或许会遇到后面造成的checkbox状态混乱,每次nofiychangedata都会遇上,主要原因在适配器adapter的getView()方法里

代码举例:getView方法内

     ...

sv.switchBtn.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        if (isChecked) {
            PreferenceUtils.setDefaultNaviAppPksName(getItem(position));
        }else{
           
            PreferenceUtils.setDefaultNaviAppPksName(null);
        } //意思是当选中时保存当前包名,不选时置空
        notifyDataSetChanged();
    }
}); //(1
紧接着下面就这样处理状态,由于是单选,只用被选中的才显示选中状态,这种情景是每次notifychagendata或者从其他界面跳转回来,或者下次启动该actvitiy时对以前的数据和状态复原
sv.switchBtn.setChecked(PreferenceUtils.getDefaultNaviAppPksName().
        trim().equals(getItem(position))?true:false);//(2
但是像上面(2这一步这样做会造成,当此条件为false时,会回调到上面 OnCheckedChangeListener的onCheckedChanged方法,这样造成参数被置空了,因为在
notifychagendata的时候会多次执行(2)这一步,
面对类似此情况,应该考虑onCheckedChanged内的处理方法避免重复执行,如果是用户手动改变checkbox状态的话,并没有影响,但是notifychagendata的时候,onCheckedChanged方法就会被动的执行回调,那么内部的处理方法也就被执行了,这种情况由开始我说的一对一关系就不正确了,这分明是多对一关系,多个checkbox状态来改变
onCheckedChanged内部的这一行代码PreferenceUtils.setDefaultNaviAppPksName(null);,所以要一对一关系就要过滤,针对性处理
sv.switchBtn.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        if (isChecked) {
            PreferenceUtils.setDefaultNaviAppPksName(getItem(position));
        }else{
            if(PreferenceUtils.getDefaultNaviAppPksName()!=null&&
                    PreferenceUtils.getDefaultNaviAppPksName().equals(getItem(position)))//(3
            PreferenceUtils.setDefaultNaviAppPksName(null);
        }
        notifyDataSetChanged();
    }
});
加个判断来确认是用户手动改变checkbox状态还是被动notify导致回调状态改变函数,这样一来当nofiy的时候只是针对其他的checkbox状态处理
这种情况遇见了两三次,对于有些人会是个容易忽略的坑,有时得花上一些时间最后才发现是这里的问题,我就是了,怪我很少用,或者知识不够咯。
就算用其他的方法比如数据库来保存状态数据,也会用到(2)步,所以这个问题值得深思,也许你们会有其他的方法来克服。
处理该方法的思维可以是
1.考虑数据变化关系对等
2.避免方法多次执行
上面我只是1

 首次博文,原理如此烂又简单的博文,不喜随喷!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值