Почему мой ListView создает только видимые дочерние элементы?

#android #listview #scroll #nullpointerexception #android-arrayadapter

#Android #listview #прокрутка #исключение nullpointerexception #android-arrayadapter

Вопрос:

Я пытаюсь создать приложение, которое состоит из угадывания определенных слов в определенном порядке.

У меня есть 16 кнопок справа, каждая из которых имеет соответствующее слово. Когда я нажимаю правильную кнопку, слово в ListView становится серым. Проблема, с которой я сталкиваюсь, заключается в том, что когда я прокручиваю ListView и нажимаю правильную кнопку, метод getChildAt начинает отсчет с первого видимого элемента, а не с начала listview; и я не знаю, как это исправить.

Я использую ArrayAdapter.

Здесь я устанавливаю адаптер:

 // frutasLista is the array with the String elements that I want to add to the list.
((ListView) activity.findViewById(R.id.listaFrutas)).setAdapter(
                new ArrayAdapter<>(activity, android.R.layout.simple_list_item_1, frutasLista)
);
  

Здесь я устанавливаю текущий цвет элемента на серый:

 // contAciertos Is the counter where I save how many word the user guessed right.
((TextView) ((ListView) activity.findViewById(R.id.listaFrutas)).getChildAt(contAciertos)).setTextColor(Color.GRAY);
contAciertos  ;
  

Когда я нажимаю на правильный элемент и не выполняю прокрутку, он работает так, как должен
Первый случай

Но если я немного прокрутю и снова щелкну по первому правильному элементу, это произойдет: второй случай

Я прокрутил вниз до ‘Platano’ и щелкнул первый правильный элемент, который был ‘Cereza’. И вместо того, чтобы сделать первый элемент ListView серым, как я пытаюсь сделать. Он изменил первый видимый элемент на тот момент, который был «Platano».

Заранее спасибо. Извините, если я не объяснил себя ясно.

Комментарии:

1. Не обновляйте представление напрямую. Вместо этого обновите список данных, которые поддерживают ваш адаптер. Тогда ваш getView() метод может правильно установить цвет на основе данных в адаптере.

2. «Почему мой ListView создает только видимые дочерние элементы?» -> Потому что это их цель. Если в вашем списке 1000 элементов, вы не хотите создавать пользовательский интерфейс для всех из них, если ваш пользователь может видеть только 10 одновременно, это сделает пользовательский интерфейс очень медленным без всякой цели. Кстати, вы должны использовать RecyclerView вместо ListView