所以在这里我试图创建一个自定义数组适配器,它也可以更改图像,但是当我这样做时,它会给我错误:
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));