Comment la position d'un adaptateur RecyclerView est-elle liée à l'index de son ensemble de données?

Je pensais qu'ils étaient les mêmes, mais ils ne sont pas. Le code suivant donne un indexOutOfBounds exception lorsque j'essaie d'accéder à la "position" de l'index de mon dataset, dans ce cas une liste d'un modèle que j'ai créé appelé Tâche:

public class TaskAdapter extends RecyclerView.Adapter<TaskAdapter.TaskViewHolder>   {
private List<Task> taskList;
private TaskAdapter thisAdapter = this;
//cache of views to reduce number of findViewById calls
public static class TaskViewHolder extends RecyclerView.ViewHolder {
protected TextView taskTV;
protected ImageView closeBtn;
public TaskViewHolder(View v) {
super(v);
taskTV = (TextView)v.findViewById(R.id.taskDesc);
closeBtn = (ImageView)v.findViewById(R.id.xImg);
}
}
public TaskAdapter(List<Task> tasks) {
if(tasks == null)
throw new IllegalArgumentException("tasks cannot be null");
taskList = tasks;
}
//onBindViewHolder binds a model to a viewholder
@Override
public void onBindViewHolder(TaskViewHolder taskViewHolder, int pos) {
final int position = pos;
Task currTask = taskList.get(pos);
taskViewHolder.taskTV.setText(currTask.getDescription());
**taskViewHolder.closeBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("TRACE", "Closing task at position " + position);
//delete from SQLite DB
Task taskToDel = taskList.get(position);
taskToDel.delete();
//updating UI
taskList.remove(position);
thisAdapter.notifyItemRemoved(position);
}
});**
}
@Override
public int getItemCount() {
//Log.d("TRACE", taskList.size() + " tasks in DB");
return taskList.size();
}
//inflates row to create a viewHolder
@Override
public TaskViewHolder onCreateViewHolder(ViewGroup parent, int pos) {
View itemView = LayoutInflater.from(parent.getContext()).
inflate(R.layout.list_item, parent, false);
Task currTask = taskList.get(pos);
//itemView.setBackgroundColor(Color.parseColor(currTask.getColor()));
return new TaskViewHolder(itemView);
}
}

La suppression de mon recyclerview donne des résultats inattendus, parfois. Parfois, l'élément de l'avant de celui cliqué est supprimé, d'autres fois un indexOutOfBounds exception se produit au "taskList.get(position)".

Lecture https://developer.android.com/reference/android/support/v7/widget/RecyclerView.Adapter.html et https://developer.android.com/training/material/lists-cards.html ne m'a pas donné plus d'informations sur les raisons de cette situation et comment le résoudre.

Il ressemble RecyclerView recycle les lignes, mais je ne m'attends pas à un indexoutofbounds exception à l'aide d'un plus petit sous-ensemble de numéros d'index de ma liste.

source d'informationauteur HukeLau_DABA