2014-03-13 105 views
1

我試圖設置我的應用程序,以便當我終止任務並重新啓動應用程序時,仍然會檢查正確的複選框。當應用程序轉到後臺時似乎沒問題,但當它完全存在時,所有複選框都是空白的。我已經嘗試了一些東西,但似乎無法讓它工作。這是我的代碼。恢復自定義陣列適配器中的複選框狀態

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,但它似乎像一個或兩個都沒有被稱爲

回答

1

onSaveInstanceState是有用的,當你需要從配置更改,低內存狀態,在後臺長時間恢復等,但如果你真的殺了任務並重新啓動應用程序,你將需要一個持久存儲機制。

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

SQLite的可能是你正在尋找的東西與你的CheckedModel;具有名稱字段和布爾型選中字段的單個表。但這絕不是唯一的方法。

你正在做持久性的方式,使用onSaveInstanceStateonActivityCreated,對於將數據保存在應用程序中是絕對正確的。只要您的應用程序正在運行(即使它已經放入後臺),它也可以使用它來恢復CheckedModel。但是,如果您希望數據在您的應用程序之外保存,例如退出應用程序並返回,請終止任務,重新啓動設備等,則需要使用上述外部永久性數據存儲機制。

+0

有兩種方法來迎合這兩種情況會更好嗎,還是應該有一個外部持久性數據存儲機制,以便將應用程序置於後臺等待並處於死亡狀態時? – Unem

+0

@Unem我認爲如果你有外部的,你不需要其他的。只有一個應該是好的。 – jacobhyphenated

相關問題