恢复自定义阵列适配器中的复选框状态



我正在尝试设置我的应用程序,以便当我杀死任务并重新启动应用程序时,正确的复选框仍将被选中。当应用程序进入后台时,它似乎没问题,但当它完全存在时,所有的复选框都是空白的。我尝试了一些方法,但似乎都不奏效。这是我的代码。

 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);
    }
}

My Array Adapter

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,但似乎一个或两个都没有被称为

onSaveInstanceState在需要从配置更改、低内存状态、长时间后台运行等情况下恢复时非常有用。但如果你真的终止任务并重新启动应用程序,你将需要一个持久的存储机制。

http://developer.android.com/guide/topics/data/data-storage.html

SQLite可能是你正在寻找与你的CheckedModel;具有名称字段和布尔复选字段的单个表。但这绝不是唯一的办法。

您使用onSaveInstanceStateonActivityCreated进行持久化的方式对于在应用程序中持久化数据是绝对正确的。只要您的应用程序正在运行(即使它已被置于后台),它就可以使用它来恢复CheckedModel。但如果你想让数据在应用程序之外持久化,比如你退出应用程序,然后返回,杀死任务,重启设备等,那么你就需要使用如上所述的外部持久化数据存储机制。

最新更新