【问题标题】:How to add a list of different objects to a constructor?如何将不同对象的列表添加到构造函数?
【发布时间】:2018-03-19 16:44:47
【问题描述】:

我有一个问题,即我有一个 AdapterRecycler,在我的构造函数中我有一个 List item,但是我有蛋糕、晚餐、饮料、沙拉和所有这些我必须放入列表的对象因为我必须在代码的几个地方使用我的 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();
}
}

【问题讨论】:

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


    【解决方案1】:

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

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

    然后在您的适配器中使用List&lt;Food&gt; 类型的字段。

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

    【讨论】:

    • 感谢您的回答,但仍然无法正常工作。当我尝试使用适配器时,它得到的答案是 java.util.List 不能应用于 java.util.List 等 ...
    【解决方案2】:

    我相信您的适配器类必须将项目列表作为其构造函数中的参数。像这样的:

    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
    

    此外,如果您想在 Adapter 中了解其项目所属的食物种类,请在项目的类中再添加一个属性,例如 type(可以是枚举)

    【讨论】:

    • 非常感谢您的回答。这个解决方案很棒。
    猜你喜欢
    • 1970-01-01
    • 2021-06-15
    • 2021-12-20
    • 2014-09-18
    • 2017-05-29
    • 2017-04-25
    • 2014-04-22
    • 2019-08-17
    • 2015-06-12
    相关资源
    最近更新 更多