6

Próbuję użyć wielu ViewHolders w RecyclerView, aby zamienić te widoki w czasie wykonywania. I zostały utworzone dwie klasy, które rozciągają RecyclerView.ViewHolder:RecyclerView onCreateViewHolder Typ zwrotu Niekompatybilność z wieloma niestandardowymi widokami ViewHolders

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(); 
} 

}

Nazywane są w zasięgu mojej klasie RecyclerViewAdapter za onCreateViewHolder funkcję:

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; 
     } 
    } 

Kiedy próbuję uruchomić kod, otrzymuję ten błąd:

Tak, kwestia wydaje się, że onCreateViewHolder nie przyjmuje moich klas niestandardowych jako dziedziczone z RecyclerView.ViewHolder. Używam Androida Studio, więc być może problem jest. Jestem zakłopotany, ponieważ myślałem, że dziedziczenie Java poradzi sobie z tym bez żadnych problemów. Czy ktoś mógłby zaproponować rozwiązanie?

Edycja: Gdy zmienię typ zwracanego obiektu onCreateViewHolder na MenuItemViewHolder z tylko jednym VH, wszystko działa poprawnie. Nie działa to jednak, gdy mam wiele klas VH, które mogą być zamienione w dowolnym momencie.

+0

Jaka jest definicja klasy "RecyclerViewAdapter"? – ianhanniballake

Odpowiedz

11

RecyclerView.Adapter jest sparametryzowaną klasą, która przyjmuje pojedynczy typ ViewHolder. Twoja definicja prawdopodobnie wygląda tak:

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

Powinno być:

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

Nie zapomnij mieć właściwą definicję onBindViewHolder również. Musisz także zastąpić getItemViewType.

+1

Chyba wystarczyło spojrzeć w górę! Tę odpowiedź potrzebowałem, dziękuję! –