如何更改RecyclerView项目onClick的viewType [英] How to Change the viewType of a RecyclerView item onClick

查看:73
本文介绍了如何更改RecyclerView项目onClick的viewType的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经创建了一个以Cards作为其主要视图类型的RecyclerView.我想要实现的是,当用户单击某个项目时,该项目的ViewType从卡片更改为另一个Viewtype(例如,水平滚动的列表文本视图).

I have created a RecyclerView with Cards as its primary viewtype. What I am trying to achieve is that when user clicks on a item the ViewType of that item is changed from cards to another Viewtype(for example a list textviews placed horizontally scrollable).

我的RecyclerView Adapter代码如下:

My code for RecyclerView Adapter is as follows :

在下面的代码中,我创建了一个枚举类型的列表,以跟踪recyclerview中每一行的单击状态,然后获得数据集的大小,并使用SHOW_PRIMARY_CONTENT初始化每一行的数组列表

In the below piece of code I have created a arrraylist of enum types to keep track of the clicked 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);
    }
}

下面是我的ViewHolder类,其中包含对我所有子视图的引用,它实现View.OnClickListener.为什么实现View.OnClickListener的原因是它可以在单击状态之间切换以相应地更改viewType.

Below is my ViewHolder Class which holds references to all my child views, It Implements View.OnClickListener. Why it implements View.OnClickListener is so that it can toggle 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);
    }
}

这是我获取getItemViewType返回的viewType值并返回夸大的布局的地方

This is where I am getting the value of viewType returned by getItemViewType and returning inflated 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);
    }
}

然后在这里,我使用viewholder.getItemViewType

Then here I m binding the views with values according to the viewType returned by the 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();
}

最后是我的getItemViewType逻辑

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 why is not anything show when I run the code ,,,Everything seems valid to me . Help Me !!!!

推荐答案

请参阅我的示例:

 // 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);

和我一起很好

这篇关于如何更改RecyclerView项目onClick的viewType的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆