Próbowałem wdrożyć funkcję jako opis: Każdy element w recyklerypieniu zostanie usunięty po 5 sekundach. Mój kod jak poniżej:

new CountDownTimer(60000, 1000) {
    @Override public void onTick(long l) {
        Log.v(TAG, "Ticking: " + l);
        for (int i = 0, dataLength = mComments.size(); i < dataLength; i++{
            RoomMessage item = mComments.get(i);
            // item.timeRemaining initial value is 5000
            item.timeRemaining -= 1000;
            if (item.timeRemaining <= 0) {
                mComments.remove(i);
                notifyItemRemoved(i);
            }
        }
    }
    @Override public void onFinish() {
        start();
    }
}.start();

APLIKACJA ARASHIONS z komunikatem o błędzie mówi jak java.lang.IndexOutOfBoundsException: Index: 4, Size: 4 Co było nie tak?

0
Dayo Choul 15 luty 2017, 19:24

2 odpowiedzi

Najlepsza odpowiedź

Problem polega na pętli.

    for (int i = 0, dataLength = mComments.size(); i < dataLength; i++)

DataLength zostanie zainicjowana tylko raz (tak samo jak I), a następnie ta wartość zostanie użyta do następnych iteracji. Tak więc, jeśli rozmiar listy jest początkowo 4, wówczas dintalgth będzie 4 przez cały rozmiar, w którym rozmiar listy będzie się zmniejszyć, co spowoduje indexoutofundSexception .

Zmień oświadczenie o poniżej:

    for (int i = 0; i < mComments.size(); i++)
3
Sanjeet 15 luty 2017, 16:36

Problem polega na mComments.remove(i); za pomocą for Po usunięciu przedmiotu Durante interakcja for Crash. Należy wymień for przez enter code here, podobnie:


    Iterator iterator = mComments.iterator();
    while (iterator.hasNext()) {
        RoomMessage item = iterator.next();
        mComments.remove(item);
        mAdapter.notifyDataSetChanged();
    }
0
Roger Tosin 15 luty 2017, 16:52