Tôi đã tạo một RecyclerView với Thẻ làm kiểu xem chính của nó. Những gì tôi đang cố gắng đạt được là khi người dùng nhấp vào một mục, ViewType của mục đó được thay đổi từ thẻ sang Viewtype khác (ví dụ: một danh sách các bản xem trước được đặt theo chiều ngang có thể cuộn được).Cách thay đổi kiểu xem của một mục RecyclerView trên Click
Mã của tôi cho RecyclerView Adapter là như sau:
Trong mảnh dưới mã tôi đã tạo ra một arrraylist các loại enum để theo dõi tình trạng nhấp của mỗi hàng trong recyclerview, sau đó tôi nhận được kích thước của bộ dữ liệu của tôi và khởi ArrayList của tôi cho mỗi hàng với 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);
}
}
Dưới đây là lớp ViewHolder tôi nắm giữ tham chiếu đến tất cả quan điểm con tôi, nó thực hiện View.OnClickListener. Tại sao nó thực hiện View.OnClickListener là để nó có thể chuyển đổi giữa các trạng thái được nhấp để thay đổi viewTypes cho phù hợp.
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);
}
}
Đây là nơi mà tôi nhận được giá trị của viewType trả về bởi getItemViewType và hoàn trả thổi phồng bố trí
@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);
}
}
Sau đó, ở đây tôi đang ràng buộc quan điểm với các giá trị theo viewType trả về bởi các viewholder viewholderusing. 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();
}
Và cuối cùng Logic getItemViewType tôi
@Override
public int getItemViewType(int position) {
if (itemClickedState.get(position) == clickedState.SHOW_SECONDARY_CONTENT)
return 1;
return 0;
}
}
Điều tôi không thể hiểu được là tại sao không có gì hiển thị khi tôi chạy mã ,, mọi thứ có vẻ hợp lệ đối với tôi. Giúp tôi !!!!