java.lang.IndexOutOfBoundsException: индекс: 1, размер: 0 - PullRequest
0 голосов
/ 27 августа 2018

У меня есть приложение, которое публикует истории в карусели, которая содержит видео и изображения. Если сообщение представляет собой видео, оно имеет значок включения / выключения звука, такой как Instagram. Когда я перехожу с первого видео на второе или третье видео и нажимаю значок включения / выключения звука, мое приложение вылетает.

Ниже приведен фрагмент кода:

ArrayList<String> b_checkSound = new ArrayList<>();
cell_soundoff.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        if (mediaPlayer != null) {
            if (mediaPlayer.isPlaying()) {
                mediaPlayer.setVolume(1, 1);
                cell_soundon.setVisibility(View.VISIBLE);
                cell_soundoff.setVisibility(View.GONE);
                if(b_checkSound != null) {
                    b_checkSound.add(position, "true");
                }
            }
        }
    }
});

cell_soundon.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        if (mediaPlayer != null) {
            if (mediaPlayer.isPlaying()) {
                mediaPlayer.setVolume(0, 0);
                cell_soundoff.setVisibility(View.VISIBLE);
                cell_soundon.setVisibility(View.GONE);
                if (b_checkSound != null && b_checkSound.size() > position) {
                    b_checkSound.remove(position);
                }
            }
        }
    }
});

Это ошибка, которую я получаю:

08-27 16:27:28.954 27154-27154/com.leadplatform.kfarmers E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.leadplatform.kfarmers, PID: 27154
    java.lang.IndexOutOfBoundsException: Index: 1, Size: 0
        at java.util.ArrayList.add(ArrayList.java:483)
        at com.leadplatform.kfarmers.view.diary.DiaryListFragment$Stroy_imageviewAdapter$1.onClick(DiaryListFragment.java:2887)
        at android.view.View.performClick(View.java:6891)
        at android.view.View$PerformClick.run(View.java:26083)
        at android.os.Handler.handleCallback(Handler.java:789)
        at android.os.Handler.dispatchMessage(Handler.java:98)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6938)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)

Ответы [ 5 ]

0 голосов
/ 27 августа 2018

Эта переменная position инициализируется в другом месте, и я не знаю, как вы ее используете и модифицируете.Вы должны знать, что индексы в списках основаны на нуле .Таким образом, для 1-й позиции позиция равна 0.Если вы не учли этот факт, вы можете получить этот тип ошибки.

0 голосов
/ 27 августа 2018

Попробуйте использовать HashMap в этом случае, потому что размер массива не фиксирован в вашем случае, и при использовании этого вы не будете беспокоиться о IndexOutOfBoundsException исключении:

        HashMap<Integer, String> b_checkSound = new HashMap<>(); //CHANGE HERE map with pos->value  
        cell_soundoff.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (mediaPlayer != null) {
                    if (mediaPlayer.isPlaying()) {
                        mediaPlayer.setVolume(1, 1);
                        cell_soundon.setVisibility(View.VISIBLE);
                        cell_soundoff.setVisibility(View.GONE);
                        if(b_checkSound != null) {
                            b_checkSound.put(position, "true"); //CHANGE HERE
                        }
                    }
                }
            }
        });
//
        cell_soundon.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (mediaPlayer != null) {
                    if (mediaPlayer.isPlaying()) {
                        mediaPlayer.setVolume(0, 0);
                        cell_soundoff.setVisibility(View.VISIBLE);
                        cell_soundon.setVisibility(View.GONE);
                        if (b_checkSound != null) {//CHANGE HERE
                            b_checkSound.remove(position);
                        }
                    }
                }
            }
        });
0 голосов
/ 27 августа 2018

Когда вы вставляете истину в b_checkSound

if(b_checkSound != null) {
b_checkSound.add(position, "true");
}

Но ваш b_checkSound имеет нулевой размер, поэтому добавьте еще одну проверку:

if(b_checkSound != null) {
   if(b_checkSound.size()==0){
      b_checkSound.add("true");
   }else{
        b_checkSound.add(position, "true");
   }
}
0 голосов
/ 27 августа 2018

Вы не можете использовать ArrayList для этого типа проблемы, потому что вы зависите от позиции, но вы не можете добавить что-либо по второму индексу в пустом массиве!

Попробуйте использовать вместо этого HashMap или если выМне действительно нравятся оптимизация и производительность, вы можете использовать битовые флаги и битовые маски.

РЕДАКТИРОВАТЬ: Я предложил это, потому что я считаю, что вы хотите отслеживать приглушение каждого отдельного элемента в адаптере.

0 голосов
/ 27 августа 2018

Кажется, ваш массив пуст и вы пытаетесь добавить элемент после первого элемента, используя position = 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...