0

J'ai un problème, à savoir j'ai un AdapterRecycler, et dans mon constructeur j'ai un objet List, mais en ce que j'ai classes Gâteau, Dîner, Boissons, Salades et tous ces objets que je dois jeter dans la liste parce que Je dois utiliser mon concepteur AdapterRecycler dans quelques endroits dans le code, mais comment faire?Comment ajouter une liste d'objets différents à un constructeur?

Par exemple:

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder>{ 

private List<Cake> cakeList = Collections.emptyList(); 
private List<Dinner> dinnerList = Collections.emptyList(); 
private List<Drinks> drinksList = Collections.emptyList(); 
private List<Salads> saladsList = Collections.emptyList(); 

***//So how to put other lists in one constructor?*** 
// 
*In the code below I still use methods to retrieve Names and Resources, so how do I tell the program to know which list to return? I can't duplicate a constructor with the same parameters, so is there any solution to this problem?* 

public RecyclerAdapter(Activity activity, List<Cake> items) { 
     this.activity = activity; 
     this.cakeList = items; 
    } 

*//I can't do this. So how?* 

public RecyclerAdapter(Activity activity, List<Salads> items) { 
     this.activity = activity; 
     this.saladsList = items; 
    } 

} 

RecyclerAdapter.class

class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> { 




private Activity activity; 
List<Salatki> items = Collections.emptyList(); 

public RecyclerAdapter(Activity activity, List<Salatki> items) { 
    this.activity = activity; 
    this.items = items; 
} 

private Listener listener; 


public static interface Listener { 
    public void onClick(int position); 
} 

public static class ViewHolder extends RecyclerView.ViewHolder { 
    private CardView cardView; 
    public ViewHolder(CardView v) { 
     super(v); 
     cardView=v; 
    } 
} 


public void setListener(Listener listener) { 
    this.listener = listener; 
} 

@Override 
public CaptionedImagesAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    CardView cv = (CardView) LayoutInflater.from(parent.getContext()) 
      .inflate(R.layout.card_captioned_image, parent, false); 
    return new ViewHolder(cv); 

} 

@Override 
public void onBindViewHolder(ViewHolder holder, final int position) { 
     CardView cardView = holder.cardView; 
     ImageView imageView = (ImageView)cardView.findViewById(R.id.info_image); 

     Drawable drawable = cardView.getResources().getDrawable(items.get(position).getImageResourceId()); 
     imageView.setImageDrawable(drawable); 
     imageView.setContentDescription(items.get(position).getName()); 

     TextView textView = (TextView)cardView.findViewById(R.id.info_text); 
     textView.setText(items.get(position).getName()); 


    cardView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if(listener != null) { 
       listener.onClick(position); 
      } 
     } 
    }); 
} 

@Override 
public int getItemCount() { 
    return items.size(); 
} 
} 

Répondre

0

Créer une classe de base ayant des méthodes "getName()" et "getResourceId()", utilisez-le dans l'adaptateur .

class Food { 
    private String name; 
    private int resourceId; 
    // getters/setters 
} 

class Cake extends Food { 

} 

class Dinner extends Food { 

} 

Ensuite, utilisez le champ de type List<Food> dans votre adaptateur.

UPD. Constructeur d'adaptateur:

public <T extends Food> RecyclerAdapter(Activity activity, List<T> items) { 
    this.activity = activity; 
    this.items = new ArrayList<>(); 
    for (Food item : items) { 
     this.items.add(item); 
    } 
} 
+0

merci pour votre réponse, mais il ne fonctionne toujours pas. Lorsque j'essaie d'utiliser l'adaptateur, il obtient la réponse que java.util.List ne peut pas être appliqué à java.util.List etc ... – newActivity21

+0

J'ai mis à jour répondre comment changer le constructeur de l'adaptateur. –

0

Je crois que votre classe d'adaptateur doit prendre une liste d'éléments en tant qu'argument dans son constructeur. Quelque chose comme ceci:

public class Item { 
    final String name; 
    final int resId; 
    public Item(String name, int resId){ 
    this.name=name; 
    this.resId=resId; 
    } 
} 

et vous constructeur comme ceci:

public RecyclerAdapter(Activity activity, List<Item> items) { 
    this.activity = activity; 
    this.items = items; 
} 

Ensuite, avant de créer votre adaptateur essayer de Carte vos listes alimentaires et ajouter tous à une seule liste comme ceci:

List<Item> items=new ArrayList(); 
for(Cake c: cakes){ 
    items.add(new Item(c.name,c.resId)); 
} 
//same for the rest food lists 

aussi, si vous voulez savoir à l'intérieur de votre adaptateur le genre de nourriture que c'est produit appartient, ajouter une propriété par exemple type (pourrait être enum) à la classe de l'article

+0

Merci beaucoup pour votre réponse. Cette solution est géniale. – newActivity21