如何将不同对象的列表添加到构造函数?

时间:2017-10-08 10:32:45

标签: java android android-fragments arraylist android-recyclerview

我有一个问题,即我有一个AdapterRecycler,在我的构造函数中我有一个List<>项目,但是我有类Cake,Dinner,Drinks,Salads以及我必须投入的所有这些对象列表因为我必须在代码中的少数几个地方使用我的AdapterRecycler设计器,但该怎么办?

例如:

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

2 个答案:

答案 0 :(得分:0)

创建具有方法&#34; getName()&#34;的基类。和&#34; getResourceId()&#34;,然后在适配器中使用它。

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

class Cake extends Food {

}

class Dinner extends Food {

}

然后在适配器中使用List<Food>类型的字段。

UPD。适配器构造函数:

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

答案 1 :(得分:0)

我相信你的适配器类必须在它的构造函数中将一个项列表作为参数。像这样:

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

和你这样的构造函数:

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

然后在创建适配器之前,尝试映射您的食物清单,并将所有这些列表添加到一个列表中,如下所示:

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

此外,如果您想在适配器内部了解其项目所属的食物种类,请在项目的课程中添加一个属性,例如type(可能是枚举) / p>