2014-10-18 3 views
0

Я хотел бы сохранить SparseBooleanArray, используя либо SharedPreferences, либо что-нибудь еще, что более предпочтительно.Как сохранить SparseBooleanArray с помощью SharedPreferences? Или любая другая альтернатива?

Я попытался использовать https://stackoverflow.com/a/16711258/2530836, но каждый раз, когда действие создано, повторно инициализируется bundle, а bundle.getParcelable() возвращает null. Я уверен, что для этого есть обходной путь, но я не достиг этого, несмотря на несколько часов мозгового штурма.

Кроме того, если нет, могу ли я использовать что-то вроде SharedPreferences?

Вот код:

public class ContactActivity extends Activity implements AdapterView.OnItemClickListener { 

    List<String> name1 = new ArrayList<String>(); 
    List<String> phno1 = new ArrayList<String>(); 
    ArrayList<String> exceptions = new ArrayList<String>(); 
    MyAdapter adapter; 
    Button select; 
    Bundle bundle = new Bundle(); 
    Context contactActivityContext; 
    SharedPreferences prefs; 
    SharedPreferences.Editor editor; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.contacts_layout); 
     getAllContacts(this.getContentResolver()); 
     ListView list= (ListView) findViewById(R.id.lv); 
     adapter = new MyAdapter(); 
     list.setAdapter(adapter); 
     list.setOnItemClickListener(this); 
     list.setItemsCanFocus(false); 
     list.setTextFilterEnabled(true); 
     prefs = PreferenceManager.getDefaultSharedPreferences(this); 
     select = (Button) findViewById(R.id.button1); 
     select.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       StringBuilder checkedcontacts = new StringBuilder(); 
       for (int i = 0; i < name1.size(); i++) 
       { 
        if (adapter.isChecked(i)) { 
         checkedcontacts.append(name1.get(i).toString()); 
         exceptions.add(name1.get(i).toString()); 
         checkedcontacts.append(", "); 
        } 
       } 
       checkedcontacts.deleteCharAt(checkedcontacts.length() - 2); 
       checkedcontacts.append("selected"); 
       editor = prefs.edit(); 
       editor.putInt("Status_size", exceptions.size()); /* sKey is an array */ 

       for(int i=0;i<exceptions.size();i++) 
       { 
        editor.remove("Status_" + i); 
        editor.putString("Status_" + i, exceptions.get(i)); 
       } 
       editor.commit(); 
       Toast.makeText(ContactActivity.this, checkedcontacts, Toast.LENGTH_LONG).show(); 
      } 
     }); 
    } 


    @Override 
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 
     // TODO Auto-generated method stub 
     adapter.toggle(arg2); 
    } 
    private void setContext(Context contactActivityContext){ 
     this.contactActivityContext = contactActivityContext; 
    } 
    protected Context getContext(){ 
     return contactActivityContext; 
    } 

    public void getAllContacts(ContentResolver cr) { 

     Cursor phones = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,null,null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC"); 
     while (phones.moveToNext()) 
     { 
      String name=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); 
      String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
      name1.add(name); 
      phno1.add(phoneNumber); 
     } 
     phones.close(); 
    } 
    class MyAdapter extends BaseAdapter implements CompoundButton.OnCheckedChangeListener 
    { SparseBooleanArray mCheckStates; 
     ContactActivity mContactActivity = new ContactActivity(); 
     LayoutInflater mInflater; 
     TextView tv1,tv; 
     CheckBox cb; 
     int mPos; 
     MyAdapter() 
     { 
      mCheckStates = new SparseBooleanArray(name1.size()); 
      mCheckStates = (SparseBooleanArray) bundle.getParcelable("myBooleanArray"); 
      mInflater = (LayoutInflater) ContactActivity.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     } 
     @Override 
     public int getCount() { 
      // TODO Auto-generated method stub 
      return name1.size(); 
     } 

     public void setPosition(int p){ 
      mPos = p; 
     } 

     public int getPosition(){ 
      return mPos; 
     } 


     @Override 
     public Object getItem(int position) { 
      // TODO Auto-generated method stub 
      return position; 
     } 

     @Override 
     public long getItemId(int position) { 
      // TODO Auto-generated method stub 

      return 0; 
     } 

     @Override 
     public View getView(final int position, View convertView, ViewGroup parent) { 
      // TODO Auto-generated method stub 
      View vi=convertView; 
      if(convertView==null) 
      vi = mInflater.inflate(R.layout.row, null); 
      tv= (TextView) vi.findViewById(R.id.textView1); 
      tv1= (TextView) vi.findViewById(R.id.textView2); 
      cb = (CheckBox) vi.findViewById(R.id.checkBox1); 
      tv.setText("Name :"+ name1.get(position)); 
      tv1.setText("Phone No :"+ phno1.get(position)); 
      cb.setTag(position); 
      cb.setChecked(mCheckStates.get(position, false)); 
      setPosition(position); 
      cb.setOnCheckedChangeListener(this); 

      return vi; 
     } 
     public boolean isChecked(int position) { 
      return mCheckStates.get(position, false); 
     } 

     public void setChecked(int position, boolean isChecked) { 
      mCheckStates.put(position, isChecked); 
     } 

     public void toggle(int position) { 
      setChecked(position, !isChecked(position)); 
     } 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      mCheckStates.put((Integer) buttonView.getTag(), isChecked); 
     } 
    } 
    @Override 
    public void onDestroy(){ 
     bundle.putParcelable("myBooleanArray", new SparseBooleanArrayParcelable(adapter.mCheckStates)); 
     super.onDestroy(); 
    } 
} 
+0

Вы используете onSaveInstanceState или нет? Может у почтовый код для справки –

+0

Нет, я не. Я хочу, чтобы данные были восстановлены, даже когда приложение перезапустится после выхода. Конечно, я отправлю код. – Slay

ответ

0

Bundle создан вами в классе, и он не используется деятельности для сохранения значения.

Если вы используете пакет приложения, вы не сможете получить экземпляр, как только вы убили приложение.

Для вас проблема лучше идти с общими предпочтениями, но по общему предпочтению вы не можете хранить объекты.

Если вы хотите использовать общие предпочтения, то есть 2 решения.

  • Преобразование объекта в строку и сохранение в общих предпочтениях и возврат назад и преобразование объекта из строки. (используйте Gson или Jackson или вы предпочитаете)
  • Используйте Complex Preferences сторонний, где вы можете хранить объекты и получать их напрямую.

Если вас больше интересует только пакет, то проверьте это обсуждение на stackoverflow.

save-bundle-to-sharedpreferences

how-to-serialize-a-bundle

Надеется, что это поможет.

+0

Могу ли я хранить пакет в ComplexPreference? Библиотека, похоже, предназначена только для объектов GSON. Я могу ошибаться. – Slay

+0

Я думаю, что он не будет хранить. Вышеупомянутый ответ говорит об объекте, а не о пакете, и две реализации делают то же самое, один вручную выполняется вами. Таким образом, у вас больше контроля, а другое - действие сторонней библиотеки. –

1

Вы можете сохранить его в SharedPreferances Что касается sparsebooleanarrays: он отображает целые числа в логические значения, поэтому вы можете сохранить его как строку, устранить фигурные скобки, пробелы и = знаки, а все, что у вас есть, - значение int (для значения индекса) и соответствующее логическое значение, разделенное запятой, теперь используют строку соответственно. Надеюсь, это поможет :)