android保存动态视图值

时间:2011-10-26 09:35:47

标签: android view save state

从标题中可能有点不清楚我想问什么,所以请允许我解释一下。

在我的项目中,我需要在while循环中创建动态视图。像这样;

private void loadCheckPointQuantity() {
    final LinearLayout rgLayoutContainer = (LinearLayout)findViewById(R.id.quantityAnswers);

    _answerCursor.moveToFirst();
    while(_answerCursor.isAfterLast() == false) {

        LinearLayout rgContainer = new LinearLayout(this);
        rgContainer.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
        rgContainer.setOrientation(LinearLayout.HORIZONTAL);

        final ImageView checked = new ImageView(this);
        checked.setMinimumHeight(30);
        checked.setMinimumWidth(30);
        if(_answerCursor.getInt(CPA_IS_CHECKED_COL) == 1) {
            checked.setBackgroundResource(R.drawable.btn_check_buttonless_on);
        } else {
            checked.setBackgroundResource(R.drawable.ic_delete);
        }
        checked.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

        TextView txtAmount = new TextView(this);
        txtAmount.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
        txtAmount.setText((_answerCursor.getPosition() + 1) + "/" + _answerCursor.getCount());
        txtAmount.setTextSize(22);

        RadioGroup rgAnswer = new RadioGroup(this);
        rgAnswer.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
        rgAnswer.setOrientation(RadioGroup.HORIZONTAL);
        rgAnswer.setOnCheckedChangeListener(new OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                switch(checkedId) {
                case 0:
                    checked.setBackgroundResource(R.drawable.ic_delete);
                    break;
                case 1:
                    checked.setBackgroundResource(R.drawable.btn_check_buttonless_on);
                    break;
                }
            }
        });

        RadioButton rbYes = new RadioButton(this);
        rbYes.setText(R.string.yes);
        rbYes.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
        rbYes.setId(1);

        RadioButton rbNo = new RadioButton(this);
        rbNo.setText(R.string.no);
        rbNo.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
        rbNo.setId(0);

        ImageButton camButton = new ImageButton(this);
        camButton.setImageResource(R.drawable.ic_menu_camera);
        camButton.setLayoutParams(new LayoutParams(70, 70));

        final EditText txtNote = new EditText(this);
        txtNote.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
        txtNote.setEnabled(false);
        txtNote.setOnFocusChangeListener(new OnFocusChangeListener() {
            @Override
            public void onFocusChange(View view, boolean hasFocus) {
                if(!hasFocus) {
                    txtNote.setSingleLine(true);
                } else {
                    txtNote.setSingleLine(false);
                }
            }
        });

        rgAnswer.addView(rbYes);
        rgAnswer.addView(rbNo);
        rgContainer.addView(checked);
        rgContainer.addView(txtAmount);
        rgContainer.addView(rgAnswer);
        rgContainer.addView(camButton);
        rgContainer.addView(txtNote);
        rgLayoutContainer.addView(rgContainer);

        if(_answerCursor.getInt(CPA_ANSWER_COL) == 1) {
            rbYes.setChecked(true);
        } else if(_answerCursor.getInt(CPA_ANSWER_COL) == 0) {
            rbNo.setChecked(true);
        }   

        if(_answerCursor.getInt(CPA_ANSWER_COL) == 0 || _answerCursor.getInt(CPA_ANSWER_COL) == 1) {
            txtNote.setEnabled(true);
        }
        _answerCursor.moveToNext();
    }
    _answerCursor.moveToFirst();
}

会发生什么,数据库中有一个字段确定应该越过循环的次数。数量。因此,如果数量为5.组件应该制作5次。

问题是,

因为我在方法中做了所有这些,所以我无法访问各个视图。 例如,这也是现实中需要发生的事情;

我点击一个按钮。然后我需要将所有结果保存在数据库中。 即EditText和isChecked的radiogroup结果。

问题是,我不知道如何访问每个单独的视图。 我想到了几个要解决的问题。但他们最终都在我脑海上创造了问号

我试过,让一个班级代表答案(isChecked,note等等(带有getter和setter) 创建一个数组列表,将它们全部放在一个arraylist中。

这应该有效。将答案放在arraylist中。但这让我有了下一个问题。我的文字改变了什么?我怎么处理这个?

如果我使用observable,我应该使应答类可观察吗,我应该为每个成员调用setChanges(),并在包含loadCheckPointQuantity的类中实现observable吗?

我对观察者有正确的经验。

按下按钮时如何保存最新数据?

我绝对无能......

因为它可能含糊不清:

我尝试实现的目的:将所有视图中的最新数据保存到数据库中 方法:需要帮助 何时:点击按钮

您理解/查看/阅读此帖的时间非常受欢迎。回答更高。

如果您需要更多代码或解释。让我知道,我会尽我所能。

1 个答案:

答案 0 :(得分:0)

我解决了我的问题。

我将eventlisteners分配给需要最终在数据库中结束的所有事情。 在焦点更改时,我将数据保存到数据库中。因此,我没有任何持有答案的清单。我即时更新数据库。不幸的是,它对性能不利。幸运的是,我们可以承受这种表现。

我尝试运行此代码告诉while循环执行3000次。除了视图生成需要一些时间(平均约3-4秒),一切都运行良好。所以我不需要跟踪方法之外生成的对象。 android / java为我做了这个。