0

我需要應用程序中的設置,這些設置將在幾個名稱庫中提供(全部位於一個項目中)。我desided用類似的方法創建類:SharedPreferenses不保存狀態

private SharedPreferences prefs; 
private Context context; 

public Preferenses(Context context){ 
    this.context=context; 
} 

public void invertLanguageState(String lang){ 
    prefs=context.getSharedPreferences(LEARN_WORDS_PREFS, Context.MODE_PRIVATE); 
    boolean state=prefs.getBoolean(lang, false); 
    Editor editor=prefs.edit(); 
    editor.putBoolean(lang,!state); 
    editor.commit(); 
} 

public void setLanguagesStates(String []langs,boolean []states){ 
    prefs=context.getSharedPreferences(LEARN_WORDS_PREFS, Context.MODE_PRIVATE); 
    Editor editor=prefs.edit(); 
    final int size=states.length; 
    for(int i=0;i<size;i++){ 
     editor.putBoolean(langs[i],states[i]); 
    } 
    editor.commit(); 
} 
public boolean [] getLanguagesStates(String []keys){ 
    prefs=context.getSharedPreferences(LEARN_WORDS_PREFS,Context.MODE_PRIVATE); 
    final int size=keys.length; 
    boolean [] states=new boolean[size]; 
    for(int i=0;i<size;i++){ 
     states[i]=prefs.getBoolean(keys[i], false); 
    } 
    return states; 
} 

然後我嘗試使用它ListActivity,我寫我的適配器代碼:

public class UsableLanguagesAdapter extends ArrayAdapter<String>{ 

private final Context context; 
private final String [] values; 
private boolean [] states; // language states in checkbox (select or not) 
private Preferenses prefs; 


public UsableLanguagesAdapter(Context context,String []values) { 

    super(context,RProvider.getLanguageUserItem(),values);  
    this.context=context; 
    this.values=values; 
    this.prefs=new Preferenses(context);  
    this.states=prefs.getLanguagesStates(values); 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    LayoutInflater inflater = (LayoutInflater) context 
     .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    View rowView = inflater.inflate(RProvider.getLanguageUserItem(), parent, false); 

    CheckBox checkBox=(CheckBox) rowView.findViewById(RProvider.getLanguageItemCheckBox()); 
    TextView textView = (TextView) rowView.findViewById(RProvider.getLanguageItemText()); 
    ImageView imageView = (ImageView) rowView.findViewById(RProvider.getLanguageItemImage()); 
    imageView.setImageResource(RProvider.getLangImageId(values[position])); 
    textView.setText(values[position]); 
    checkBox.setSelected(states[position]);  
    final int pos=position; 
    checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

      @Override 
      public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) { 
       Boolean state=prefs.getLangugeState(values[pos]); 
       Log.d(state.toString(),"show state"); 
       prefs.invertLanguageState(values[pos]); 
       state=prefs.getLangugeState(values[pos]); 
       Log.d(state.toString(),"show state"); 
       ///checkBox.setSelected(isChecked); 
      }    
    }); 
    return rowView; 
} 

}

但unforchantly當我重裝活動,所有複選框都未選中。你能說我如何解決這個問題嗎?此外,這一結果在其他活動中也是必要的。

回答

1

如果我沒有誤解

checkBox.setSelected(states[position]); 

你需要設置你的複選框的checked性能。 checkBox.setChecked(boolean)

從DOC:

setChecked(boolean) 

更改視圖

+0

states是布爾數組 – Abbath

+0

@Abbath is states [position] boolean? – Blackbelt

0

問題是checkBox.setSelected的選中狀態(狀態[位置]);保證checkBox.setChecked(狀態[position])