How to change the viewType type of a RecyclerView onClick element

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!!!!

+8
android android-recyclerview recycler-adapter
source share
3 answers

see my example:

  // RecycleItemObject.java public class RecycleItemObject { public static int LAYOUT_ITEM_PORTRAIN = 0; public static int LAYOUT_ITEM_LANDSCAPE = 1; private int type; .................... /** * @return get layout type of item */ public int getType() { return type; } /** * set layout type of item * @param type */ public void setType(int type) { this.type = type; } } // adapter public Holder onCreateViewHolder(ViewGroup parent, int viewType) { View view; if (viewType == RecycleItemObject.LAYOUT_ITEM_PORTRAIN) { view = LayoutInflater.from(context).inflate(R.layout.item_recycle_view_main, parent, false); } else { view = LayoutInflater.from(context).inflate(R.layout.item_recycle_view_main_land, parent, false); } } // event click item @onClick.... curentObject.setType(RecycleItemObject.LAYOUT_ITEM_LANDSCAPE); // notify item only notifyItemChanged(itemPosition); 

it works fine with me

+4
source share

I hope you understand your problem. If not, then I did it f or you. Buggy string

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

This is where you add a new item to

  itemClickedState.add(getAdapterPosition(), clickedState.SHOW_SECONDARY_CONTENT); 

This will add a new item and mdataList size, and itemClickState will be different and therefore an incorrect match will occur.

Use itemClickedState.set(getAdapterPosition(), clickedState.SHOW_SECONDARY_CONTENT); instead. And secondly, I do not understand what tvTicketClass is . If it is one TextView, you must first connect the string, and do tvTicketClass.settext(concatenatedstrClass) . Hope you are helped in this post. If you have another problem, make a comment.

+2
source share

override getItemViewType in the adapter and return the itemtype element that you want. for further verification of this link https://guides.codepath.com/android/Heterogenous-Layouts-inside-RecyclerView

0
source share

All Articles