我创建了一个带有Cards作为主要视图类型的RecyclerView。我想要实现的是,当用户点击某个项目时,该项目的ViewType会从卡片更改为另一个Viewtype(例如,列表文本视图可以水平滚动)。
我的RecyclerView适配器代码如下:
在下面的代码中,我创建了一个枚举类型的arrraylist来跟踪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类,它包含对我所有子视图的引用,它实现了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);
}
}
这是我获取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使用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();
}
最后是我的getItemViewType逻辑
@Override
public int getItemViewType(int position) {
if (itemClickedState.get(position) == clickedState.SHOW_SECONDARY_CONTENT)
return 1;
return 0;
}
}
我无法理解的是,当我运行代码时,为什么没有任何显示,一切似乎对我有效。帮我 !!!!
答案 0 :(得分: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);
和我一起工作很好
答案 1 :(得分:2)
希望你已经找到了问题所在。如果没有,那么我已经做过了或者你。 有缺陷的线是
@Override
public void onClick(View v) {
itemClickedState.add(getAdapterPosition(), clickedState.SHOW_SECONDARY_CONTENT);
}
这里你要做的是添加一个新的项目
itemClickedState.add(getAdapterPosition(), clickedState.SHOW_SECONDARY_CONTENT);
这将插入一个新项目,并且mdataList和itemClickState的大小不同,因此会发生错误匹配。
使用itemClickedState.set(getAdapterPosition(), clickedState.SHOW_SECONDARY_CONTENT);
代替。第二件事我不明白 tvTicketClass 是什么。如果它是单个TextView,那么您应首先连接字符串,然后执行tvTicketClass.settext(concatenatedstrClass)
。希望你能从这篇文章得到帮助。如果有任何进一步的问题,请发表评论。
答案 2 :(得分:0)
覆盖适配器中的getItemViewType并返回所需的itemtype。有关详情,请查看此链接https://guides.codepath.com/android/Heterogenous-Layouts-inside-RecyclerView