Ich dachte, sie wären gleich, aber sie sind es nicht. Der folgende Code gibt eine IndexOutOfBounds Ausnahme, wenn ich versuche, den „Position“ Index meines Datensatz zuzugreifen, in diesem Fall eine Liste eines Modells I Aufgabe genannt erstellt:Wie hängt die Position eines RecyclerView-Adapters mit dem Index seines Datensatzes zusammen?
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);
}
}
Löschen von meinem recyclerview manchmal unerwarteten Ergebnissen. Manchmal wird das Element vor dem angeklickten Element gelöscht, manchmal kommt eine indexOutOfBounds-Ausnahme bei "taskList.get (position)" vor.
Lesen https://developer.android.com/reference/android/support/v7/widget/RecyclerView.Adapter.html und https://developer.android.com/training/material/lists-cards.html gab mir keinen weiteren Einblick, warum dies geschah und wie es zu beheben ist.
Es sieht so aus, als ob RecyclerView die Zeilen recycelt, aber ich würde nicht erwarten, dass eine indexoutofbounds -Ausnahme eine kleinere Teilmenge von Zahlen verwendet, um meine Liste zu indizieren.
Entschuldigung, ich habe Ihre ganze Frage nicht gelesen, aber in Ihrem Code denke ich, der zweite Parameter von onCreateViewHolder bezieht sich nicht auf die Position des Elements in Adapter, aber die "ViewType", die ViewHolder erstellt wird. Lesen Sie die Referenz für weitere Details :) –
https://developer.android.com/reference/android/support/v7/widget/RecyclerView.Adapter.html#createViewHolder (android.view.ViewGroup,%20int) Hier ist, wo es ist verwandte Methoden sind definiert. Übrigens sollten Sie Ihr Aufgabenobjekt nur in der onBindViewHolder-Methode erhalten: -? –