6

Tôi đang cố gắng sử dụng nhiều ViewHolders trong RecyclerView để hoán đổi các chế độ xem này trong thời gian chạy. Tôi đã tạo ra hai lớp mà mở rộng RecyclerView.ViewHolder:RecyclerView onCreateViewHolder Loại tương phản không tương thích với nhiều ViewHolders tùy chỉnh

MenuItemViewHolder

public class MenuItemViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 

public TextView menuItemText; 
public ImageView menuItemPhoto; 
public RecyclerViewAdapter rva; 

public MenuItemViewHolder(View itemView) { 
    super(itemView); 
    itemView.setOnClickListener(this); 

    rva = caller; 
    menuItemText = (TextView) itemView.findViewById(R.id.grid_text); 
    menuItemPhoto = (ImageView) itemView.findViewById(R.id.grid_image); 
} 

@Override 
public void onClick(View view) { 
    Toast.makeText(view.getContext(), "Clicked Position = " + getPosition(), Toast.LENGTH_SHORT).show(); 

} 

}

SelectedItemViewHolder

public class SelectedItemViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 

public TextView menuItemText; 
public ImageView menuItemPhoto; 
public RecyclerViewAdapter rva; 

public SelectedItemViewHolder(View itemView) { 
    super(itemView); 
    itemView.setOnClickListener(this); 

    menuItemText = (TextView) itemView.findViewById(R.id.grid_text_full); 
    menuItemPhoto = (ImageView) itemView.findViewById(R.id.grid_image_full); 
} 

@Override 
public void onClick(View view) { 
    Toast.makeText(view.getContext(), "Clicked Position = " + getPosition(), Toast.LENGTH_SHORT).show(); 
} 

}

Họ được gọi là trong phạm vi chức năng onCreateViewHolder lớp RecyclerViewAdapter của tôi:

RecyclerViewAdapter onCreateViewHolder

// Create new views (invoked by the layout manager) 
    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     switch (viewType) { 
      case 0: 
       View gridItemLayout = LayoutInflater.from(parent.getContext()) 
         .inflate(R.layout.grid_single, parent, false); 
       // set the view's size, margins, paddings and layout parameters 
       MenuItemViewHolder vh = new MenuItemViewHolder(gridItemLayout); 
      case 2: 
       View selectedItemLayout = LayoutInflater.from(parent.getContext()) 
         .inflate(R.layout.grid_single_full, parent, false); 
       // set the view's size, margins, paddings and layout parameters 
       SelectedItemViewHolder sivh = new SelectedItemViewHolder(selectedItemLayout); 
       return sivh; 
     } 
    } 

Khi tôi cố gắng chạy mã, tôi nhận được lỗi này:

Vì vậy, vấn đề có vẻ là onCreateViewHolder không chấp nhận các lớp tùy chỉnh của tôi khi được thừa hưởng từ RecyclerView.ViewHolder. Tôi đang sử dụng Android Studio, vì vậy có lẽ vấn đề là ở đó. Tôi lúng túng, vì tôi nghĩ rằng Java thừa kế sẽ xử lý điều này mà không có vấn đề gì. Ai đó có thể đề xuất một giải pháp?

Chỉnh sửa: Khi tôi thay đổi kiểu trả về của onCreateViewHolder thành MenuItemViewHolder chỉ với một VH, mọi thứ hoạt động tốt. Tuy nhiên, điều này không hoạt động khi tôi có nhiều lớp VH có thể được hoán đổi bất cứ lúc nào.

+0

Định nghĩa lớp học của 'RecyclerViewAdapter' là gì? – ianhanniballake

Trả lời

11

RecyclerView.Adapter là một lớp được tham số hóa trong một loại đơn ViewHolder. định nghĩa của bạn có thể trông giống như:

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.MenuItemViewHolder> 

Nó nên là:

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> 

Đừng quên để có định nghĩa phù hợp với onBindViewHolder là tốt. Bạn cũng cần ghi đè lên getItemViewType.

+1

Tôi đoán tất cả những gì tôi phải làm là nhìn lên! Đây là câu trả lời tôi cần, cảm ơn bạn! –

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