2015-04-11 15 views
8

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 !!!!

Trả lời

4

xem ví dụ của tôi:

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

với tôi nó hoạt động tốt

2

Hy vọng bạn đã tìm ra vấn đề của bạn. Nếu không thì tôi đã làm nó hoặc bạn. Dòng buggy là

@Override 
    public void onClick(View v) { 
     itemClickedState.add(getAdapterPosition(), clickedState.SHOW_SECONDARY_CONTENT); 
    } 

Ở đây những gì bạn đang làm là thêm một mục mới để

itemClickedState.add(getAdapterPosition(), clickedState.SHOW_SECONDARY_CONTENT); 

này sẽ chèn một mục mới và kích thước của mdataList và itemClickState khác và do đó phù hợp mis xảy ra.

Sử dụng itemClickedState.set(getAdapterPosition(), clickedState.SHOW_SECONDARY_CONTENT); để thay thế. Và điều thứ hai tôi không hiểu những gì tvTicketClass là. Nếu đó là một TextView, thì bạn nên nối chuỗi đầu tiên và chúng làm tvTicketClass.settext(concatenatedstrClass). Hy vọng bạn nhận được trợ giúp từ bài đăng này.Nếu có bất kỳ vấn đề nào khác, vui lòng nhận xét.

Các vấn đề liên quan