Fixed crash when changing controller types

This commit is contained in:
SSimco
2025-03-10 17:15:53 +02:00
parent 24b1cff66d
commit 827b607629
@@ -6,46 +6,60 @@ import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Objects;
import java.util.stream.IntStream;
public class GenericRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private record RecyclerViewItemTuple(int viewTypeId, RecyclerViewItem item) {
}
private final List<RecyclerViewItem> recyclerViewItems = new ArrayList<>();
private final List<RecyclerViewItemTuple> recyclerViewItems = new ArrayList<>();
private int currentViewTypeId = 0;
private final HashMap<Integer, Integer> recyclerViewItemsViewTypeHasMap = new HashMap<>();
public void addRecyclerViewItem(RecyclerViewItem recyclerViewItem) {
recyclerViewItems.add(recyclerViewItem);
int viewTypeId = currentViewTypeId++;
recyclerViewItems.add(new RecyclerViewItemTuple(viewTypeId, recyclerViewItem));
int position = recyclerViewItems.size() - 1;
recyclerViewItemsViewTypeHasMap.put(viewTypeId, position);
notifyItemInserted(recyclerViewItems.size() - 1);
}
public void removeRecyclerViewItem(RecyclerViewItem recyclerViewItem) {
int position = recyclerViewItems.indexOf(recyclerViewItem);
if (position == -1) {
var position = IntStream.range(0, recyclerViewItems.size()).filter(index -> recyclerViewItems.get(index).item == recyclerViewItem).findFirst();
if (position.isEmpty()) {
return;
}
recyclerViewItems.remove(position);
notifyItemRemoved(position);
var itemTuple = recyclerViewItems.get(position.getAsInt());
recyclerViewItemsViewTypeHasMap.remove(itemTuple.viewTypeId);
recyclerViewItems.remove(itemTuple);
notifyItemRemoved(position.getAsInt());
}
public void clearRecyclerViewItems() {
int itemsCount = recyclerViewItems.size();
recyclerViewItems.clear();
recyclerViewItemsViewTypeHasMap.clear();
notifyItemRangeRemoved(0, itemsCount);
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int position) {
return recyclerViewItems.get(position).onCreateViewHolder(parent);
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewTypeId) {
Integer position = Objects.requireNonNull(recyclerViewItemsViewTypeHasMap.get(viewTypeId));
return recyclerViewItems.get(position).item.onCreateViewHolder(parent);
}
@Override
public int getItemViewType(int position) {
return position;
return recyclerViewItems.get(position).viewTypeId;
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
recyclerViewItems.get(position).onBindViewHolder(holder, this);
recyclerViewItems.get(position).item.onBindViewHolder(holder, this);
}
@Override