基本上,我有一个带有复选框的可扩展列表视图,我希望将它们的状态保存到共享首选项中。我正在实施的方法有效,但我有一种感觉,这并不是它可能的全部。看到它崩溃我不会感到惊讶。基本上使用我的方法,我通过序列化加载和保存我的活动类中的状态。
SharedPreferences settings3 = getSharedPreferences("MYPREFS", 0);
try {
check_states = (ArrayList<ArrayList<Integer>>) ObjectSerializer.deserialize(settings3.getString("CBSTATES", ObjectSerializer.serialize(new ArrayList<ArrayList<Integer>>())));
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
中间还有一些代码。
protected void onStop() {
SharedPreferences settings3 = getSharedPreferences("MYPREFS", 0);
SharedPreferences.Editor editor3 = settings3.edit();
try {
editor3.putString("CBSTATES", ObjectSerializer.serialize(check_states));
} catch (IOException e) {
e.printStackTrace();
}
editor3.commit();
}
为了从我的实际可扩展适配器中获取数组列表,我将它实例化为静态变量并进行传输。在我的 espandablelistadpater 类中 -->
// set checkbox states
static ArrayList<ArrayList<Integer>> check_states = new ArrayList<ArrayList<Integer>>();
public void setChildrenAndValues() {
//initialize the states to all 0;
for(int i = 0; i < children.length; i++) {
ArrayList<Integer> tmp = new ArrayList<Integer>();
for(int j = 0; j < children[i].length; j++) {
tmp.add(0);
}
check_states.add(tmp);
}
}
这是getChildView
public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild,
View convertView, ViewGroup parent) {
LayoutInflater childInflate = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View childView = childInflate.inflate(R.layout.mtopics_childview, parent, false);
TextView childtxt = (TextView)childView.findViewById(R.id.mtopicschildtv);
childtxt.setText(getChild(groupPosition, childPosition).toString());
// Load the checkbox states
setChildrenAndValues();
final CheckBox childcb = (CheckBox)childView.findViewById(R.id.mtopicchildchkbox);
if (check_states.get(groupPosition).get(childPosition) == 1) {
childcb.setChecked(true);
}else{ childcb.setChecked(false);
}
childcb.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
if (childcb.isChecked()) {
check_states.get(groupPosition).set(childPosition, 1);
}else{ check_states.get(groupPosition).set(childPosition, 0);
}
}
});
return childView;
我只是想知道我是否一切正常,或者我是否错过了一步,因为我实际上可以感觉到减速,尤其是在反序列化时。也许我应该在另一个线程中执行此操作(无论这意味着什么)。我是否以正确的方式使用静态变量,因为我在两个方向上都在改变它们。也许我错过了一个 if null 语句。