0

プログラムで子を追加した LinearLayout があります。

for (int i = 0; i < answers.size(); i++) {
            final AnswerView answerView = new AnswerView(getContext(), i);
            addView(answerView);
}

次に、ランダムな子にアクセスしようとしています:

private void updateOpenAnswer() {
        new AsyncTask<Void, Void, Integer>() {

            @Override
            protected Integer doInBackground(Void... voids) {
                return API.getOpenAnswer();
            }

            @Override
            protected void onPostExecute(Integer answerIndex) {
                super.onPostExecute(answerIndex);

                Log.i(TAG, "Child count: " + getChildCount());

                if (answerIndex != -1) {
                    Log.i(TAG, "Open answer: " + answerIndex);
                    final AnswerView answerView = (AnswerView) getChildAt(answerIndex);
                    if (answerView != null) {
                        answerView.setAnswerOpen(true);
                    } else {
                        Log.e(TAG, "Null at " + answerIndex);
                    }
                }
            }
        }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
    }

updateOpenAnswer は runnable で 1 秒に 1 回呼び出されます。updateOpenAnswer の一部の呼び出しでは、getChildAt が null を返し、getChildCount が 0 を返します。たとえば、2 と 3 は null で、0、1、4、5 は null ではありません。2 と 3 のビューは実際に存在し、私には見えます。null を返すのはなぜですか?

4

1 に答える 1

1

最終的な AnswerView answerView = 新しい AnswerView(getContext(), i);

最も可能性の高い問題はgetContext()、null を返すことです。に変更してみてください

YourActivity.this // this also returns Context

そして今、それはうまくいくはずです。

アップデート:

getChildAt()表示されている位置のみのビューが返されることを忘れないでください。したがって、スクロール中に「ビュー内」にない子を取得したい場合は、null が返されます。

于 2013-03-13T15:35:01.210 に答える