2014-10-18 70 views
0

我想使用SharedPreferences或其他任何方法保存SparseBooleanArray,这是更受欢迎的。如何使用SharedPreferences保存SparseBooleanArray?还是其他的选择?

我试过使用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或不?你可以张贴代码以供参考 – 2014-10-18 13:02:41

+0

不,我不是。即使应用在退出后重新启动,我也希望数据得到恢复。当然,我会发布代码。 – Slay 2014-10-18 13:05:52

回答

0

摞由您在类中创建并且不使用活动来存储值。

如果您正在使用该应用程序包,则在您终止该应用程序后仍然无法获取该实例。

因为你是问题更好去与共享偏好,但在共享偏好,你不能存储对象。

如果您想使用共享首选项,那么有2个解决方案。

  • 对象转换为字符串并将其存储在共享的偏好和检索回来,从字符串改革对象。 (使用Gson或Jackson或您首选的方式)
  • 使用Complex Preferences第三方一,您可以在其中存储对象并直接检索。

如果你对使用bundle更感兴趣,那么请检查stackoverflow上的这个讨论。

save-bundle-to-sharedpreferences

how-to-serialize-a-bundle

希望这会帮助你。

+0

我可以在ComplexPreference中存储一个包吗?该库似乎只适用于GSon对象。我可能是错的。 – Slay 2014-10-18 14:09:29

+0

我认为它不会存储。上面的答案告诉我们使用Object而不是bundle,两个实现都是一样的,一个是由你手工完成的。所以你有更多的控制权,其他人正在给第三方图书馆采取行动。 – 2014-10-18 14:17:10

1

您可以将其存储在SharedPreferances 约sparsebooleanarrays的事情是:它映射整数布尔值,因此可以将其保存为一个字符串,消除括号,空格和=迹象,你已经是一个int值(用于索引值)和相应的布尔值(用逗号分隔)现在相应地使用该字符串。希望它有助于:)

相关问题