Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/234.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
Android 还原自定义阵列适配器中的复选框状态_Android_Checkbox_Android Listview_Android Arrayadapter - Fatal编程技术网

Android 还原自定义阵列适配器中的复选框状态

Android 还原自定义阵列适配器中的复选框状态,android,checkbox,android-listview,android-arrayadapter,Android,Checkbox,Android Listview,Android Arrayadapter,我正在尝试设置我的应用程序,以便在我终止任务并重新启动应用程序时,仍会选中正确的复选框。当应用程序进入后台时,它似乎是正常的,但当它完全存在时,所有复选框都是空白的。我试过几次,但似乎都没能成功。这是我的密码 public class SyncHomeFragment extends ListFragment { ListView listView; Button button; ArrayAdapterWithCheck adapter; boolean c

我正在尝试设置我的应用程序,以便在我终止任务并重新启动应用程序时,仍会选中正确的复选框。当应用程序进入后台时,它似乎是正常的,但当它完全存在时,所有复选框都是空白的。我试过几次,但似乎都没能成功。这是我的密码

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

}

在应用程序被终止和还原后,是否有方法还原每个复选框的状态?环顾四周,我认为使用onSaveInstanceState和onActivityCreated,但似乎其中一个或两个都没有被调用

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

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


使用
onSaveInstanceState
onActivityCreated
进行持久化的方法对于在应用程序中持久化数据是绝对正确的。只要您的应用程序正在运行(即使它已被放置在后台),它就可以使用它来恢复CheckedModel。但是如果您希望数据在应用程序之外持久化,比如退出应用程序并返回,终止任务,重新启动设备,等等。然后您需要使用如上所述的外部持久性数据存储机制。

最好同时使用这两种方法来满足这两种情况,还是我应该只使用外部持久性数据存储机制来存储应用程序被置于后台ect和被终止ect时的数据?@Unem我认为如果您有外部持久性数据存储机制一个,你不需要另一个。只要一个就好了。
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;
    }
}