Прокручиваем просмотр и редактируем дочерний фон, давая исключение нулевого указателя

Я пытаюсь прокрутить представление рециркулятора и изменить фон данного элемента в представлении рециркулятора, поскольку он прокручивается синхронно с движком 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);

взятие номера из держателя вида, а не из адаптера, который считает только вид

Другие вопросы по тегам