Добавление нового элемента в RecyclerView с заголовком, вызывающим ArrayIndexOutOfBoundsException - PullRequest
0 голосов
/ 08 сентября 2018

Мой RecyclerAdapter работает, но когда я добавляю в него новый элемент и затем нажимаю какую-то кнопку, возникает исключение ArrayIndexOutOfBoundsException.

Существует два сценария заполнения моего списка: первый - когда появляются новые вставленные данные, что делает его позицию сверху, другой - для разбиения на страницы, когда пользователь прокручивает вниз еще 4 новых загруженных элемента.

Это для добавления нового элемента

 //This will be called only if user added some new post
                                      postList.add(0, post);
                                      //Notify the adapter that new item is added
                                      postRecyclerAdapter.notifyItemInserted(0);
                                      //Notify the adapter to update all position
                                      postRecyclerAdapter.notifyItemRangeChanged(0, postList.size() + 1 );

При нумерации страниц я просто добавляю старые данные

 postList.add(annonPost);
                            //Update the Recycler adapter that new data is added
                            postRecyclerAdapter.notifyItemInserted(postList.size());

Вот так выглядит мой onBindViewHolder.

  @Override
public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder viewHolder, int position) {

    if (viewHolder instanceof ItemViewHolder){

        ItemViewHolder holder = (ItemViewHolder) viewHolder;

//I have a Firebase listeners here that updates the setAttributes automatically when a button is clicked
holder.setAttribute(someValueFromListener, 
postList.get(getItem(holder.getAdapterPosition())).name);
}}}

Теперь, поскольку у меня есть заголовок, я получаю позицию и количество предметов

 private int getItem(int position){
    return position - 1;
}

@Override
public int getItemCount() {
    return this.postList.size() + 1;
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public int getItemViewType(int position) {

    if (position == 0)
        return TYPE_HEADER;

    return TYPE_ITEM;
}

Добавление нового элемента в порядке, но как только я начал нажимать какую-то кнопку, чтобы вызвать прослушиватель Firebase, я получаю java.lang.ArrayIndexOutOfBoundsException: length=12; index=-2. Что-то не так с позицией? Я также проверил значение getItem (holder.getAdapterPosition ()) , и это нормально.

1 Ответ

0 голосов
/ 08 сентября 2018

вот из-за этого метода:

private int getItem(int position){
    return position - 1;
}

Вы должны заменить его на:

private int getItem(int position){
        return this.postList.get(position);
    }
...