So ändern Sie den viewType eines RecyclerView-Elements onClick

Ich habe eine RecyclerView mit Karten als primärem Ansichtstyp erstellt. Ich versuche zu erreichen, dass der ViewType dieses Elements von Karten auf einen anderen ViewType geändert wird, wenn der Benutzer auf ein Element klickt (z. B. eine horizontal scrollbare Liste mit Textansichten).

Mein Code für den RecyclerView Adapter lautet wie folgt:

Im folgenden Codeteil habe ich eine Array-Liste mit Aufzählungstypen erstellt, um den angeklickten Status jeder Zeile in der Recycling-Übersicht zu verfolgen. Anschließend habe ich die Größe meines Datensatzes abgerufen und meine Array-Liste für jede Zeile mit SHOW_PRIMARY_CONTENT @ initialisier

public class DisplayItemsAdapter extends RecyclerView.Adapter<DisplayItemsAdapter.ViewHolder> {

private static ArrayList<clickedState> itemClickedState;
private enum clickedState {
    SHOW_PRIMARY_CONTENT,
    SHOW_SECONDARY_CONTENT
}

private ArrayList<ItemData> mDataset = new ArrayList<>();

public DisplayItemsAdapter(ArrayList<ItemData> dataset) {
    mDataset = dataset;
    itemClickedState = new ArrayList<>();
    for (int i = 0; i < mDataset.size(); i++) {
        itemClickedState.add(i, clickedState.SHOW_PRIMARY_CONTENT);
    }
}

Below ist meine ViewHolder-Klasse, die Verweise auf alle meine untergeordneten Ansichten enthält. Sie implementiert View.OnClickListener. Der Grund für die Implementierung von View.OnClickListener besteht darin, dass zwischen angeklickten Status umgeschaltet werden kann, um viewTypes entsprechend zu ändern.

public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    TextView tvItemName;
    TextView tvItemNumber;

    public ViewHolder(View itemView) {
        super(itemView);

        tvItemName = (TextView) itemView.findViewById(R.id.tvItemName);
        tvItemNumber = (TextView) itemView.findViewById(R.id.tvItemNumber);

        tvTicketClass = (TextView) itemView.findViewById(R.id.tvTicketClass);
    }

    @Override
    public void onClick(View v) {
        itemClickedState.add(getAdapterPosition(), clickedState.SHOW_SECONDARY_CONTENT);
    }
}

ier erhalte ich den Wert von viewType, der von getItemViewType zurückgegeben wird, und geblähtes Layou

@Override
public DisplayItemsAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
    View v1 = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.display_Items_row, viewGroup, false);
    View v2 = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.display_Items_ticket_class, viewGroup, false);
    if (viewType == 0) {
        return new ViewHolder(v1);
    } else {
        return new ViewHolder(v2);
    }
}

Then hier binde ich die Ansichten mit Werten entsprechend dem viewType, der vom viewholder zurückgegeben wird, using viewholder.getItemViewType

@Override
public void onBindViewHolder(DisplayItemsAdapter.ViewHolder viewHolder, final int position) {
    if (viewHolder.getItemViewType() == 0) {
        viewHolder.tvItemName.setText(mDataset.get(position).strItemName);
        viewHolder.tvItemNumber.setText(mDataset.get(position).strItemNumber);
    } else if (viewHolder.getItemViewType() == 1) {
        for (int i = 0; i < mDataset.get(position).strClass.length; i++) {
            viewHolder.tvTicketClass.setText(mDataset.get(position).strClass[i]);
        }
    }
}

@Override
public int getItemCount() {
    return mDataset.size();
}

Und schließlich meine getItemViewType-Logik

@Override
public int getItemViewType(int position) {
    if (itemClickedState.get(position) == clickedState.SHOW_SECONDARY_CONTENT)
        return 1;
    return 0;
}
}

Was ich nicht verstehen konnte ist, warum nichts angezeigt wird, wenn ich den Code ausführe ,,, Alles scheint mir gültig zu sein. Hilf mir !!!

Antworten auf die Frage(6)

Ihre Antwort auf die Frage