我試圖設置我的應用程序,以便當我終止任務並重新啓動應用程序時,仍然會檢查正確的複選框。當應用程序轉到後臺時似乎沒問題,但當它完全存在時,所有複選框都是空白的。我已經嘗試了一些東西,但似乎無法讓它工作。這是我的代碼。恢復自定義陣列適配器中的複選框狀態
public class SyncHomeFragment extends ListFragment {
ListView listView;
Button button;
ArrayAdapterWithCheck adapter;
boolean checkedState;
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
View rootView = inflater.inflate(R.layout.activity_sync_home, container, false);
button = (Button) rootView.findViewById(R.id.confirm_button);
adapter = new ArrayAdapterWithCheck(getActivity(), getModel());
setListAdapter(adapter);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//TODO for test only remove
boolean [] items = adapter.getCheckBoxState();
for(Boolean b : items){
/*String item = Boolean.toString(b);
Toast.makeText(getActivity().getBaseContext(), item, 0).show();*/
List<CheckedModel> checkedModels = adapter.getList();
String item = checkedModels.get(1).getName();
Toast.makeText(getActivity().getBaseContext(), item, 0).show();
}
}
});
return rootView;
}
@Override public void onSaveInstanceState(Bundle savedInstanceState) {
boolean[] itemStates = adapter.getCheckBoxState();
savedInstanceState.putBooleanArray("CheckBoxState", itemStates);
}
@Override public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if(savedInstanceState != null) {
boolean[] checkedState = savedInstanceState.getBooleanArray("CheckBoxState");
adapter.setCheckBoxState(checkedState);
}
}
private List<CheckedModel> getModel() {
List<CheckedModel> list = new ArrayList<CheckedModel>();
list.add(get("Linux"));
list.add(get("Windows7"));
list.add(get("Suse"));
list.add(get("Eclipse"));
list.add(get("Ubuntu"));
list.add(get("Solaris"));
list.add(get("Android"));
list.add(get("iPhone"));
return list;
}
private CheckedModel get(String s) {
return new CheckedModel(s);
}
}
我的數組適配器
public class ArrayAdapterWithCheck extends ArrayAdapter<CheckedModel> {
private final List<CheckedModel> list;
private final Activity context;
private boolean [] checkBoxState;
private ViewHolder viewHolder;
public ArrayAdapterWithCheck(Activity context, List<CheckedModel> list) {
super(context, R.layout.row_layout_with_check, list);
this.context = context;
this.list = list;
checkBoxState = new boolean[list.size()];
}
static class ViewHolder {
protected ImageView image;
protected TextView text;
protected CheckBox checkbox;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View view = null;
if (convertView == null) {
LayoutInflater inflator = context.getLayoutInflater();
view = inflator.inflate(R.layout.row_layout_with_check, null);
viewHolder = new ViewHolder();
viewHolder.image = (ImageView) view.findViewById(R.id.icon);
viewHolder.text = (TextView) view.findViewById(R.id.label);
viewHolder.checkbox = (CheckBox) view.findViewById(R.id.check);
viewHolder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
CheckedModel element = (CheckedModel) viewHolder.checkbox.getTag();
element.setSelected(buttonView.isChecked());
checkBoxState[position] = isChecked;
//save(list.get(position), checkBoxState[position]);
String item = Boolean.toString(checkBoxState[position]);
//TODO Remove
Toast.makeText(getContext(), item, 0).show();
}
});
viewHolder.checkbox.setChecked(checkBoxState[position]);
view.setTag(viewHolder);
viewHolder.checkbox.setTag(list.get(position));
} else {
view = convertView;
((ViewHolder) view.getTag()).checkbox.setTag(list.get(position));
}
ViewHolder holder = (ViewHolder) view.getTag();
holder.text.setText(list.get(position).getName());
holder.checkbox.setChecked(list.get(position).isSelected());
return view;
}
public List<CheckedModel> getList() {
return list;
}
public boolean[] getCheckBoxState() {
return checkBoxState;
}
public void setCheckBoxState(boolean[] checkBoxState) {
this.checkBoxState = checkBoxState;
for(int i = 0; i<checkBoxState.length; i++){
viewHolder.checkbox.setChecked(checkBoxState[i]);
}
}
}
我的模型
public class CheckedModel extends BasicModel {
private boolean selected;
public CheckedModel(String name) {
super(name);
selected = false;
}
public boolean isSelected() {
return selected;
}
public void setSelected(boolean selected) {
this.selected = selected;
}
}
是否有恢復每個複選框的狀態下,應用程序被殺害和恢復後的方法嗎?從環顧四周,我認爲使用onSaveInstanceState和onActivityCreated,但它似乎像一個或兩個都沒有被稱爲
有兩種方法來迎合這兩種情況會更好嗎,還是應該有一個外部持久性數據存儲機制,以便將應用程序置於後臺等待並處於死亡狀態時? – Unem
@Unem我認爲如果你有外部的,你不需要其他的。只有一個應該是好的。 – jacobhyphenated