如何在onClick上更改RecyclerView项的viewType

Anu*_*iya 8 android recycler-adapter android-recyclerview

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

我的RecyclerView适配器代码如下:

在下面的代码中,我创建了一个枚举类型的arrraylist来跟踪recyclerview中每一行的点击状态,然后我得到了我的数据集的大小,并用SHOW_PRIMARY_CONTENT为每一行初始化了我的arraylist

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

@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);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,我根据viewholder使用viewholder.getItemViewType返回的viewType将视图与值绑定

@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();
}
Run Code Online (Sandbox Code Playgroud)

最后是我的getItemViewType逻辑

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

我无法理解的是,当我运行代码时,为什么没有任何显示,一切似乎对我有用.帮我 !!!!

vuh*_*990 5

看我的例子:

 // 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);
Run Code Online (Sandbox Code Playgroud)

和我一起工作正常