From 827b6076291a5ae0128eae43cd3188ee586ad304 Mon Sep 17 00:00:00 2001 From: SSimco <37044560+SSimco@users.noreply.github.com> Date: Sat, 2 Nov 2024 10:47:49 +0200 Subject: [PATCH] Fixed crash when changing controller types --- .../GenericRecyclerViewAdapter.java | 34 +++++++++++++------ 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/src/android/app/src/main/java/info/cemu/Cemu/guibasecomponents/GenericRecyclerViewAdapter.java b/src/android/app/src/main/java/info/cemu/Cemu/guibasecomponents/GenericRecyclerViewAdapter.java index 52f153aa..0b065b4b 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/guibasecomponents/GenericRecyclerViewAdapter.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/guibasecomponents/GenericRecyclerViewAdapter.java @@ -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 { + private record RecyclerViewItemTuple(int viewTypeId, RecyclerViewItem item) { + } - private final List recyclerViewItems = new ArrayList<>(); + private final List recyclerViewItems = new ArrayList<>(); + private int currentViewTypeId = 0; + private final HashMap 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