Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/199.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
listview中的复选框在android暂停时重置_Android_Listview_Checkbox - Fatal编程技术网

listview中的复选框在android暂停时重置

listview中的复选框在android暂停时重置,android,listview,checkbox,Android,Listview,Checkbox,我拥有的内容:活动中包含复选框的Listview 发生了什么: onPause发生,屏幕恢复,复选框被重新设置 恢复原状 如何解决这个问题 活跃 输入适配器 adpthomedeail.java 公共类AdptHomeDetail扩展BaseAdapter{ 数组列表mserialNumber; 私有上下文mContext=null; 公共AdptHomeDetail(上下文,ArrayList序列号){ 超级(); mContext=上下文; mserialNumber=序列号; } pub

我拥有的内容:活动中包含复选框的Listview

发生了什么:

  • onPause发生,屏幕恢复,复选框被重新设置 恢复原状

  • 如何解决这个问题


  • 活跃 输入适配器 adpthomedeail.java

    公共类AdptHomeDetail扩展BaseAdapter{
    数组列表mserialNumber;
    私有上下文mContext=null;
    公共AdptHomeDetail(上下文,ArrayList序列号){
    超级();
    mContext=上下文;
    mserialNumber=序列号;
    }
    public int getCount(){
    返回mserialNumber.size();
    }
    公共序列号getItem(int位置){
    返回mserialNumber.get(位置);
    }
    公共长getItemId(int位置){
    返回位置;
    }
    公共视图getView(最终整数位置、视图转换视图、视图组父视图){
    视图=转换视图;
    最终持票人;
    if(convertView==null){
    LayoutInflater布局=(LayoutInflater)mContext.getSystemService(Context.layout\u INFLATER\u SERVICE);
    视图=布局。充气(R.layout.adp\u act\u myorder\u detail,空);
    vHolder=新的视图支架(视图);
    view.setTag(vHolder);
    vHolder.checkBox.setOnCheckedChangeListener(新建CompoundButton.OnCheckedChangeListener()){
    @凌驾
    检查更改后的公共无效(复合按钮视图,布尔值已检查){
    int getPosition=(Integer)buttonView.getTag();//这里我们使用setTag获取为复选框设置的位置。
    mserialNumber.get(getPosition).setIsChecked(buttonView.isChecked());//设置复选框的值以保持其状态。
    }
    });
    view.setTag(R.id.checkBox,vHolder.checkBox);
    }否则{
    vHolder=(ViewHolder)view.getTag();
    }
    vHolder.checkBox.setTag(位置);//此行很重要。
    vHolder.checkBox.setChecked(mSerialNumbers.get(position.isChecked());//恢复维护的复选框状态
    vHolder.txtNameId.setText(mSerialNumbers.get(position.getProduct().getName());
    vHolder.txtSlnoId.setText(mContext.getResources().getString(R.string.myOrderDetailSlnoTag)+“”+mSerialNumbers.get(position.getSerial_num()+“”);
    返回视图;
    }
    类视图持有者{
    私有文本视图txtNameId,txtSlnoId;
    复选框;
    公共视图持有者(视图库){
    txtNameId=(TextView)base.findviewbyd(R.id.txtNameId);
    txtSlnoId=(TextView)base.findViewById(R.id.txtSlnoId);
    checkBox=(checkBox)base.findViewById(R.id.checkBox);
    }
    }
    

    }

    您可以创建一个扩展类“应用程序”的类,并将复选框的状态保存在该类中,以便在恢复活动时可以恢复复选框的状态

    尝试调用
    适配器。notifyDataSetChanged()
    onResume()
    方法中

    onPause发生,屏幕恢复,复选框被重新设置 恢复原状

    这是正常的行为。上面没有一个答案是不起作用的。您需要做的是使用onSaveInstanceState()其中将您的选择存储在ListView或您正在使用的任何AdapterView中,然后在onCreate()中“重新生成”您的选择

    所以,在适配器中,您可以将检查状态保存到SparseBooleanArray中,您将在其中存储复选框的位置和选中/未选中状态

    在onSaveInstanceState()方法中,您将存储它们

    在onCreate()方法中,您将重新生成它,如下所示:

    public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       // init widgets
    
       // after activity was re-created during rotation
       if (savedInstanceState != null) {
          // restore your selections in Adapter
       }
    }
    
    这会解决你面临的问题

    更新:

    是否有任何示例演示如何使用sparce布尔arry

    基本上,您只需要创建例如onCheckedChangeListener,并将其附加到AdapterView中每行的复选框中。在此侦听器中,您将使用项的当前位置和选中/未选中状态:

    check.setOnCheckedChangeListener(new OnCheckedChangeListener() {
       @Override
       public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
          mSparseArray.put(position, isChecked); 
       }
    });
    

    您可以直接在getView()方法中获得位置,并且isChecked状态是作为方法参数的复选框的当前状态。

    谢谢![+1] ... 是否有任何示例显示如何在stackoverflow或其他地方将sparce boolean arry用于此用例
    public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       // init widgets
    
       // after activity was re-created during rotation
       if (savedInstanceState != null) {
          // restore your selections in Adapter
       }
    }
    
    check.setOnCheckedChangeListener(new OnCheckedChangeListener() {
       @Override
       public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
          mSparseArray.put(position, isChecked); 
       }
    });