Прокручиваем просмотр и редактируем дочерний фон, давая исключение нулевого указателя
Я пытаюсь прокрутить представление рециркулятора и изменить фон данного элемента в представлении рециркулятора, поскольку он прокручивается синхронно с движком Android TTS, прокрутка работает без проблем, но изменение фоновых разрывов (NPE), как только есть слишком много элементов в представлении, я полагаю, это из-за того, что представление переработчика уничтожает детей, но, будучи новичком, я не уверен, что вот мой код для прокрутки представления
public void onInit(int initStatus) {
if (initStatus == TextToSpeech.SUCCESS) {
myTTS.setLanguage(Locale.UK);
//myExclusiveTTS.setLanguage(Locale.UK);
myExclusiveTTS.setOnUtteranceProgressListener(new UtteranceProgressListener() {
@Override
public void onDone(String utteranceId) {
runOnUiThread(new Runnable() {
@Override
public void run() {
System.out.println("onDone " + cardCountPosition +" list size " + SpeakGridDB.cardMakerList.size());
SpeakGridDB.recyclerView.getLayoutManager().getChildAt(cardCountPosition).setBackgroundResource(R.drawable.border);
cardCountPosition ++;
if(cardCountPosition == SpeakGridDB.cardMakerList.size()){
System.out.println("onDone if " + cardCountPosition +" list size " + SpeakGridDB.cardMakerList.size());
cardCountPosition = 0;
}
}
});
}
@Override
public void onError(String utteranceId) {
}
@Override
public void onStart(String utteranceId) {
System.out.println("onStart " + cardCountPosition +" list size " + SpeakGridDB.cardMakerList.size());
moveView();
}
});
} else if (initStatus == TextToSpeech.ERROR) {
Toast.makeText(this, "Oops sorry! Text To Speech failed... SimpleAAC cannot fix this", Toast.LENGTH_LONG).show();
}
}
public void moveView(){
runOnUiThread(new Runnable() {
@Override
public void run() {
if (cardCountPosition < SpeakGridDB.cardMakerList.size()){
SpeakGridDB.recyclerView.getLayoutManager()
.smoothScrollToPosition(SpeakGridDB.recyclerView, null, cardCountPosition + 1);
SpeakGridDB.recyclerView.getLayoutManager().getChildAt(cardCountPosition).setBackgroundResource(R.drawable.selected_blue_border);
}
else{
//this never gets called
cardCountPosition = 0;
}
}
});
}
мой NPE происходит от метода moveView @
SpeakGridDB.recyclerView.getLayoutManager()
.getChildAt(cardCountPosition).setBackgroundResource
(R.drawable.selected_blue_border);
если у меня только 1,2,3 или 4 элемента в представлении, это будет работать без сбоев, и мои распечатки выглядят так
I/System.out: onStart 0 list size 3
I/System.out: onDone 0 list size 3
I/System.out: onStart 1 list size 3
I/System.out: onStart 1 list size 3
I/System.out: onDone 1 list size 3
I/System.out: onDone 2 list size 3
I/System.out: onDone if 3 list size 3
более 4 (примерно столько элементов, которые умещаются на экране) аварийно завершает работу с NPE, но мои распечатки выглядят одинаково, может кто-нибудь подсказать, что мне нужно проверить, прежде чем устанавливать фоновый ресурс представления
1 ответ
Нашел ответ на это в другом посте, которым я сейчас пользуюсь
SpeakGridDB.recyclerView.findViewHolderForAdapterPosition
(cardCountPosition).itemView.setBackgroundResource(R.drawable.border);
взятие номера из держателя вида, а не из адаптера, который считает только вид