尝试创建自定义数组适配器

时间:2017-07-04 17:08:26

标签: java android

所以这里我试图创建一个自定义数组适配器,也可以更改图像,但是当我这样做时它会给我错误:

    public class CustomAdapter extends ArrayAdapter {
public CustomAdapter(@NonNull Context context, String [] food_text,int [] food_image) {
    super(context,R.layout.custom_row,food_text,food_image);
} 

但如果我这样做,它就不会:

    public class CustomAdapter extends ArrayAdapter {
public CustomAdapter(@NonNull Context context, String [] food_text) {
    super(context,R.layout.custom_row,food_text);
}

以下是自定义适配器的完整代码:

public class CustomAdapter extends ArrayAdapter {

int[] food_image;

public CustomAdapter(@NonNull Context context, String [] food_text, int[] food_image) {
    super(context,R.layout.custom_row,food_text);
    this.food_image=food_image;
}



@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
    LayoutInflater inflater = LayoutInflater.from(getContext());
    View foodView = inflater.inflate(R.layout.custom_row,parent,false);


    String singleFoodItem = (String) getItem(position);
    int SingleFoodImage = (int) getItem(position);
    TextView Food_text = (TextView) foodView.findViewById(R.id.Food_text);
    ImageView food_image = (ImageView) foodView.findViewById(R.id.food_image);

    Food_text.setText(singleFoodItem);
    food_image.setImageResource(SingleFoodImage);





    return foodView;
}

}

我收到此错误:java.lang.String无法强制转换为java.lang.Integer

1 个答案:

答案 0 :(得分:0)

ArrayAdapter具有特定的构造函数,其签名在docs

中被藐视
ArrayAdapter(Context context, int resource)
ArrayAdapter(Context context, int resource, int textViewResourceId)
ArrayAdapter(Context context, int resource, T[] objects)
ArrayAdapter(Context context, int resource, int textViewResourceId, T[] objects)
ArrayAdapter(Context context, int resource, List<T> objects)
ArrayAdapter(Context context, int resource, int textViewResourceId, List<T> objects)

因为你的构造函数与上述任何一个都没有匹配,所以错误

所以如果你想要一些额外的参考,那么使用

 public class CustomAdapter extends ArrayAdapter {
     int [] food_image;

    public CustomAdapter(@NonNull Context context, String [] food_text,int [] food_image) {
        super(context,R.layout.custom_row,food_text);
        this.food_image=food_image;
      }
  } 

我们已通过String数组String [] food_text,您无法将其转换为int

int SingleFoodImage = (int) getItem(position); // error, string can't be converted to int

所以使用这个

int SingleFoodImage = food_image[position];
//  use the food_image

food_image.setImageResource(SingleFoodImage);

更新:如果您计划很快或稍后应用过滤,那么您将面临图像位置数组不匹配的问题,因此我们需要创建POJO

1。)创建一个类

class Food{
    private int imageID;
    private String text;
    public Food(){}
    public Food(String oText ,int oImage ){ text=oText; imageID=oImage;}
    // getters and setters 
    public int getImageID(){ return imageID;}
    public String getText(){ return text;}
}

2。)创建POJO个对象列表并使用此适配器

public class CustomAdapter extends ArrayAdapter<Food> {

   public CustomAdapter(@NonNull Context context, List<Food> items) {
        super(context,R.layout.custom_row,items);
      }

@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
    LayoutInflater inflater = LayoutInflater.from(getContext());
    View foodView = inflater.inflate(R.layout.custom_row,parent,false);

    Food singleFoodItem = getItem(position);
    TextView Food_text = (TextView) foodView.findViewById(R.id.Food_text);
    ImageView food_image = (ImageView) foodView.findViewById(R.id.food_image);

    Food_text.setText(singleFoodItem.getText());
    food_image.setImageResource(singleFoodItem.getImageID());
    return foodView;
}} 

创建列表的示例

List<Food> foods = new ArrayList<>();
foods.add(new Food("Mango",R.drawable.image1));