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