5

既に膨張したレイアウトに複数のテキストビューを追加しようとしています。表示される情報はデータベースから取得され、データベースの行ごとに 1 つのテキストビューが作成されます。データベースは非常に大きくなる可能性があるため、バックグラウンド スレッドで各テキストビューを一度に 1 つずつ作成し、それをフォアグラウンドに追加します。

以下は、フォアグラウンドを更新するためにバックグラウンド スレッドで呼び出される関数です。

private TextView temp;
private void addClickableEvent(ReviewHistoryEvent e){
    if(e == null){
        Log.e(tag,"Attempted to add a null event to review history");
        return;
    }
    TextView t = new TextView(getBaseContext());
    t.setTag(e);
    t.setText(e.getTime()+"  "+e.getEvent());
    t.setClickable(true);
    t.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
    t.setTextAppearance(getBaseContext(), R.style.Information_RegularText);
    t.setGravity(Gravity.CENTER);
    t.setOnClickListener(this);

    temp = t;
    runOnUiThread(new Runnable() {
         public void run() {
             LinearLayout display = (LinearLayout) findViewById(R.id.reviewHistory_display);
            display.addView(temp);
        }
    });
}

この関数は 1 回正常に実行され、最初のテキストビューが表示されます。ただし、2 回目に呼び出されると、display.addView(temp); で失敗します。次のエラーのある行:

java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the childs's parent first.

テキストビューが新しくインスタンス化されたと思われる場合、なぜ私のテキストビューにすでに親があるのか​​ わかりません。また、一時テキストビューを使用して、ランナブルがローカルのテキストビュー t を参照できないことを回避します。これは正しいです?どんな助けでも大歓迎です。

4

1 に答える 1

4

メンバー変数(もちろん、変更可能でローカルではない)を使用するfinal TextView代わりに、代わりに次を使用します。

final TextView t = new TextView(getBaseContext());
// ...

temp = t; // Remove this
runOnUiThread(new Runnable() {
     public void run() {
        // ...
        display.addView(t);
    }
});
于 2013-02-12T22:21:11.907 に答える