gpt4 book ai didi

android - 如何更改 RecyclerView 项目的 viewType onClick

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:07:56 27 4
gpt4 key购买 nike

我创建了一个 RecyclerView,并将 Cards 作为其主要 View 类型。我想要实现的是,当用户单击某个项目时,该项目的 ViewType 从卡片更改为另一种 Viewtype(例如,水平滚动的列表 TextView )。

我的 RecyclerView Adapter 代码如下:

在下面的代码中,我创建了一个枚举类型的数组列表来跟踪 recyclerview 中每一行的点击状态,然后我得到了我的数据集的大小,并使用 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 类,它包含对我所有 subview 的引用,它实现了 View.OnClickListener。它实现 View.OnClickListener 的原因是它可以在点击状态之间切换以相应地更改 View 类型。

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 值并返回膨胀布局的地方

@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 返回的 viewType 使用 viewholder.getItemViewType 将 View 与值绑定(bind)

@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 逻辑

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

我无法理解的是,为什么当我运行代码时什么都没有显示,,,一切对我来说似乎都是有效的。帮我 !!!!

最佳答案

看我的例子:

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

我用的很好

关于android - 如何更改 RecyclerView 项目的 viewType onClick,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29579717/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com