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 中每秒调用一次。对于 updateOpenAnswer 的某些调用,getChildAt 返回 null 并且 getChildCount 返回 0!例如,2 和 3 为 null,0、1、4、5 为非 null。2 和 3 的观点确实存在,我看到了。为什么它返回null?

4

1 回答 1

1

final AnswerView answerView = new AnswerView(getContext(), i);

最可能的问题是getContext()返回 null。尝试将其更改为

YourActivity.this // this also returns Context

现在它应该可以工作了。

更新:

不要记住,这getChildAt()只会返回正在显示的位置的视图。因此,如果您正在滚动并想要获取不在“视图中”的子项,则将返回 null。

于 2013-03-13T15:35:01.210 回答