正在尝试创建自定义阵列适配器



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

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

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

最新更新