0

基本上,我有一个带有复选框的可扩展列表视图,我希望将它们的状态保存到共享首选项中。我正在实施的方法有效,但我有一种感觉,这并不是它可能的全部。看到它崩溃我不会感到惊讶。基本上使用我的方法,我通过序列化加载和保存我的活动类中的状态。

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 语句。

4

1 回答 1

0

ArrayLists 有一个 CAPACITY,你可以在声明/初始化实例时显式设置它;a 如果您未指定容量,则应用默认值。

每当元素的数量超过容量时,该容量就会被重置。我没有使用过 ArrayLists,但假设它们表现为类似的集合,超出容量会导致容量增加到更大的值,然后为新容量分配空间,然后从“旧”较小的值中复制所有值存储到新的。

我想,这就是减慢代码速度的原因:每次增加容量时,都会重复复制越来越多的数据。

验证(和补救):尝试初始化您的数组列表 - 使用将整数作为初始容量参数的构造函数 - 使用它们最终将采用的大小,即 children.length

于 2012-09-30T23:10:58.570 回答