Android CheckedTextView如何更新视图

Android CheckedTextView how to update the view

我已经以编程方式将 CheckedTextView 添加到线性布局视图中。请看下面的代码:

private LinearLayout linearLayout;
private CheckedTextView checkedtextview;
    linearLayout = (LinearLayout) findViewById(R.id.statusView);
    checkedtextview = new CheckedTextView(ScanStatus.this, null, android.R.attr.listChoiceIndicatorMultiple);
    checkedtextview.setText(R.string.applications);
    linearLayout.addView(checkedtextview);

稍后在代码中我必须像下面这样更新 checkedtextview:

checkedtextview.setCheckMarkDrawable(getDrawable(R.mipmap.check1));
checkedtextview.setChecked(true);
checkedtextview.setTextColor(Color.GREEN);
linearLayout.addView(checkedtextview);

但这会导致崩溃并显示以下日志:

D/AndroidRuntime(24818):正在关闭虚拟机 E/AndroidRuntime(24818):致命异常:main E/AndroidRuntime(24818):进程:com.example.ashwini.timapp,PID:24818 E/AndroidRuntime(24818): java.lang.IllegalStateException: 指定的 child 已经有一个 parent。您必须先在 child 的 parent 上调用 removeView()。

请建议我如何更新视图?

我认为您首先需要删除视图,然后再更新它。

linearLayout.removeView(checkedtextview);
checkedtextview.setCheckMarkDrawable(getDrawable(R.mipmap.check1));
checkedtextview.setChecked(true); 
checkedtextview.setTextColor(Color.GREEN); 
linearLayout.addView(checkedtextview);

您似乎在尝试将 checkedtextview 添加两次。

要更改选中状态,您可以从 linearLayout 获取视图,如下所示

或者linearLayout.getChildAt(position) 要么 在您的 class 中保留对 checkedtextview 的引用,并随时更改状态。

你有两个选择。首先,如果您一直引用您的 checkedtextview - 您可以更新它而无需调用 addView:

    checkedtextview.setCheckMarkDrawable(getDrawable(R.mipmap.check1));
checkedtextview.setChecked(true);
checkedtextview.setTextColor(Color.GREEN);.   

第二种情况使用@坚持远方回答的提示:

    linearLayout.removeView(checkedtextview);
checkedtextview.setCheckMarkDrawable(getDrawable(R.mipmap.check1));
checkedtextview.setChecked(true); 
checkedtextview.setTextColor(Color.GREEN); 
linearLayout.addView(checkedtextview);

你可以检查

  if (checkedtextview.getParent() == null) {
        // thn add your childview
    } else {
        linearLayout.removeAllViews();
        //add your child view herer
    }

或者如果您不想从父项中删除所有子项,那么您可以试试这个:

 if (checkedtextview.getParent() != null)
        ((ViewGroup)checkedtextview.getParent()).removeView(checkedtextview);
    linearLayout.addView(checkedtextview);