I created a RecyclerView with Maps as the main view. What I'm trying to achieve is that when a user clicks on an element, the ViewType of that element changes from maps to another Viewtype (for example, text views of a list are placed horizontally scrollable).
My code for the RecyclerView adapter is as follows:
In the code snippet below, I created an arithmetic of enum types to track the click state of each row in recyclerview, then I got the size of my dataset and initialized my arraylist for each row with SHOW_PRIMARY_CONTENT
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 is my ViewHolder class containing links to all of my child views, it implements View.OnClickListener. Why it implements View.OnClickListener so that it can switch between clicked states to change viewTypes accordingly.
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); } }
Here I get the viewType value returned by getItemViewType and returning an oversized layout
@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 here I associate the views with the values ββaccording to the type of viewType returned by viewholderusing 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(); }
And finally, my getItemViewType logic
@Override public int getItemViewType(int position) { if (itemClickedState.get(position) == clickedState.SHOW_SECONDARY_CONTENT) return 1; return 0; } }
What I could not understand is that for some reason they do not show anything when I run the code, Everything seems to me correct. Help me!!!!