Myślałem, że są takie same, ale nie są. Poniższy kod daje wyjątek indexOutOfBounds przy próbie uzyskania dostępu do „Pozycja” indeks mojego zbioru danych, w tym przypadku wykaz modelu stworzyłem zwanego zadanie:Jaka jest pozycja adaptera RecyclerView powiązanego z indeksem jego zestawu danych?
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);
}
}
Usuwanie z moim recyclerview daje nieoczekiwane rezultaty czasami. Czasami element przed jednym kliknięciem jest usuwany, innym razem wyjątek indexOutOfBounds występuje w "taskList.get (position)".
Czytanie https://developer.android.com/reference/android/support/v7/widget/RecyclerView.Adapter.html i https://developer.android.com/training/material/lists-cards.html nie dało mi lepszego wglądu w to, dlaczego tak się dzieje i jak to naprawić.
Wygląda na to, że RecyclerView przetwarza wiersze, ale nie spodziewałbym się wyjątku indexupofound przy użyciu mniejszego podzbioru liczb w celu indeksowania mojej listy.
Niestety nie przeczytałem całego twojego pytania, ale w twoim kodzie, myślę, że drugi parametr onCreateViewHolder nie odnosi się do pozycji elementu w adapterze, ale pojawi się "viewType", który jest tworzony ViewHolder. Przeczytaj referencję, aby uzyskać więcej szczegółów :) –
https://developer.android.com/reference/android/support/v7/widget/RecyclerView.Adapter.html#createViewHolder(android.view.ViewGroup,%20int) Oto, gdzie jest zdefiniowano powiązaną metodę. Btw powinieneś dostać swój element zadania tylko w tylko onBindViewHolder: -? –