java .lang.IndexOutOfBoundsException ошибка при использовании ItemTouchHelper в recyclerView? - PullRequest
0 голосов
/ 25 февраля 2020

Я прочитал все стековые потоки с этой темой, и проблема не решена. У меня ItemTouchHelper:

ItemTouchHelper helper = new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(
                0,
                ItemTouchHelper.LEFT|ItemTouchHelper.RIGHT)
         {
            @Override
            public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull ViewHolder viewHolder, @NonNull ViewHolder target) {
                return false;
            }

        @Override
        public void onSwiped(@NonNull ViewHolder viewHolder, int direction) {
            mNotes.remove(viewHolder.getAdapterPosition());
            mAdapter.notifyItemChanged(viewHolder.getAdapterPosition());
        }
    });`enter code here`

, который подключен к recyclerView с помощью этого адаптера:

public class NotesAdapter extends RecyclerView.Adapter<NotesAdapter.MyViewHolder> {

List<Note> notes;
Context context;
public NotesAdapter(List<Note> notes, Context context) {
    this.notes = notes;
    this.context = context;
}

public void setNotes(List<Note> notes) {
    this.notes = notes;
}

@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(context).inflate(R.layout.note_list_item, parent, false);
    return new MyViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
    holder.bind(notes.get(position));
}

@Override
public int getItemCount() {
    return notes.size();
}

public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    TextView title, text, date;
    Note mNote;
    public MyViewHolder(@NonNull View itemView) {
        super(itemView);
        itemView.setOnClickListener(this);
        title = itemView.findViewById(R.id.note_item_title);
        text = itemView.findViewById(R.id.note_item_text);
        date = itemView.findViewById(R.id.note_item_date);
    }

    @Override
    public void onClick(View v) {
        Intent intent = NoteEditActivity.newIntent(context, mNote);
        context.startActivity(intent);
    }

    public void bind(Note note) {
        mNote = note;
        text.setText(note.getText());
        title.setText(note.getTitle());
        date.setText(note.getDate().toString());
    }
}

}

, а recyclerView имеет LinearLayoutManager. когда я попытался провести пальцем, я получил эту ошибку:

java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter positionViewHolder{ac354a70 position=10 id=-1, oldPos=10, pLpos:-1 scrap [attachedScrap] tmpDetached no parent} androidx.recyclerview.widget.RecyclerView{aba0d698 VFED.... .F....I. 0,0-1080,1581 #7f08008b app:id/recycler_view}, adapter:com.example.notebook_v2.NotesAdapter@ac317680, layout:androidx.recyclerview.widget.LinearLayoutManager@aba66738, context:com.example.notebook_v2.NoteListActivity@ab9fd968
    at androidx.recyclerview.widget.RecyclerView$Recycler.validateViewHolderForOffsetPosition(RecyclerView.java:5715)
    at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5898)
    at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5858)
    at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5854)
    at androidx.recyclerview.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2230)
    at androidx.recyclerview.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1557)
    at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1517)
    at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:612)
    at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep1(RecyclerView.java:3875)
    at androidx.recyclerview.widget.RecyclerView.dispatchLayout(RecyclerView.java:3639)
    at androidx.recyclerview.widget.RecyclerView.onLayout(RecyclerView.java:4194)
    at android.view.View.layout(View.java:14817)
    at android.view.ViewGroup.layout(ViewGroup.java:4631)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
    at android.view.View.layout(View.java:14817)
    at android.view.ViewGroup.layout(ViewGroup.java:4631)
    at androidx.drawerlayout.widget.DrawerLayout.onLayout(DrawerLayout.java:1231)
    at android.view.View.layout(View.java:14817)
    at android.view.ViewGroup.layout(ViewGroup.java:4631)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
    at android.view.View.layout(View.java:14817)
    at android.view.ViewGroup.layout(ViewGroup.java:4631)
    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671)
    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525)
    at android.widget.LinearLayout.onLayout(LinearLayout.java:1434)
    at android.view.View.layout(View.java:14817)
    at android.view.ViewGroup.layout(ViewGroup.java:4631)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
    at android.view.View.layout(View.java:14817)
    at android.view.ViewGroup.layout(ViewGroup.java:4631)
    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671)
    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525)
    at android.widget.LinearLayout.onLayout(LinearLayout.java:1434)
    at android.view.View.layout(View.java:14817)
    at android.view.ViewGroup.layout(ViewGroup.java:4631)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
    at android.view.View.layout(View.java:14817)
    at android.view.ViewGroup.layout(ViewGroup.java:4631)
    at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1987)
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1744)
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1000)
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5670)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
    at android.view.Choreographer.doCallbacks(Choreographer.java:574)
    at android.view.Choreographer.doFrame(Choreographer.java:544)
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
    at android.os.Handler.handleCallback(

Я не знаю, что делать, и inte rnet мне пока не помог. enter code here

1 Ответ

0 голосов
/ 25 февраля 2020

Причина, по которой вы получаете эту ошибку, в том, что вы звоните notifyItemChanged вместо notifyItemRemoved. Вы удаляете элемент из mNotes, поэтому в вашем списке на один элемент меньше, чем раньше. Когда вы звоните notifyItemChanged, он сообщает адаптеру, что вы только что изменили элемент, поэтому ничего не удалилось. Адаптер ищет последний элемент для загрузки, но там его нет!

Попробуйте использовать это:

ItemTouchHelper helper = new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(
            0,
            ItemTouchHelper.LEFT|ItemTouchHelper.RIGHT)
     {
        @Override
    public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull ViewHolder 
                viewHolder, @NonNull ViewHolder target) {
        return false;
    }

    @Override
    public void onSwiped(@NonNull ViewHolder viewHolder, int direction) {
        mNotes.remove(viewHolder.getAdapterPosition());
        mAdapter.notifyItemRemoved(viewHolder.getAdapterPosition());
    }
});`enter code here`
...