首页 > 解决方案 > Android 因致命 execption main java.lang.ClassCastException 崩溃:java.lang.String 无法转换为包

问题描述

我正在从 phpmyadmin 获取列表视图数据库到 Android。进入食物页面时,我一直在崩溃。我的代码没有错误,我检查了我的 android 监视器,我看到了错误。

04-25 00:12:17.273 1731-1731/com.fypunimas.fyp E/AndroidRuntime: FATAL EXCEPTION: main
                                                             Process: com.xxxx, PID: 1731
                                                             java.lang.ClassCastException: java.lang.String cannot be cast to com.xxxx.Food
                                                                 at com.xxxx.CustomAdapter.getView(CustomAdapter.java:66)
                                                                 at android.widget.AbsListView.obtainView(AbsListView.java:2486)
                                                                 at android.widget.ListView.makeAndAddView(ListView.java:1970)
                                                                 at android.widget.ListView.fillDown(ListView.java:704)
                                                                 at android.widget.ListView.fillFromTop(ListView.java:765)
                                                                 at android.widget.ListView.layoutChildren(ListView.java:1744)
                                                                 at android.widget.AbsListView.onLayout(AbsListView.java:2266)
                                                                 at android.view.View.layout(View.java:17723)
                                                                 at android.view.ViewGroup.layout(ViewGroup.java:5739)
                                                                 at android.support.constraint.ConstraintLayout.onLayout(ConstraintLayout.java:1197)
                                                                 at android.view.View.layout(View.java:17723)
                                                                 at android.view.ViewGroup.layout(ViewGroup.java:5739)
                                                                 at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
                                                                 at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
                                                                 at android.view.View.layout(View.java:17723)
                                                                 at android.view.ViewGroup.layout(ViewGroup.java:5739)
                                                                 at android.support.v7.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:437)
                                                                 at android.view.View.layout(View.java:17723)
                                                                 at android.view.ViewGroup.layout(ViewGroup.java:5739)
                                                                 at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
                                                                 at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
                                                                 at android.view.View.layout(View.java:17723)
                                                                 at android.view.ViewGroup.layout(ViewGroup.java:5739)
                                                                 at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1741)
                                                                 at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585)
                                                                 at android.widget.LinearLayout.onLayout(LinearLayout.java:1494)
                                                                 at android.view.View.layout(View.java:17723)
                                                                 at android.view.ViewGroup.layout(ViewGroup.java:5739)
                                                                 at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
                                                                 at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
                                                                 at com.android.internal.policy.DecorView.onLayout(DecorView.java:874)
                                                                 at android.view.View.layout(View.java:17723)
                                                                 at android.view.ViewGroup.layout(ViewGroup.java:5739)
                                                                 at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2350)
                                                                 at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2072)
                                                                 at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1258)
                                                                 at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6468)
                                                                 at android.view.Choreographer$CallbackRecord.run(Choreographer.java:908)
                                                                 at android.view.Choreographer.doCallbacks(Choreographer.java:720)
                                                                 at android.view.Choreographer.doFrame(Choreographer.java:655)
                                                                 at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:894)
                                                                 at android.os.Handler.handleCallback(Handler.java:751)
                                                                 at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                 at android.os.Looper.loop(Looper.java:154)
                                                                 at android.app.ActivityThread.main(ActivityThread.java:6256)
                                                                 at java.lang.reflect.Method.invoke(Native Method)
                                                                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
                                                                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:793)

从错误中,它说明语句“final Food foods=(Food)getItem(position);”有一些问题。我的 customadapter.activity 代码如下

class CustomAdapter extends BaseAdapter {
public ArrayList<String> stringlist;
private Context context;
CustomAdapter(Context context, ArrayList<String> stringlist) {
    //super(context, R.layout.item_food, stringlist);
    this.context = context;
    this.stringlist = stringlist;
}

public int getCount(){
    return stringlist.size();
}

public Object getItem(int position){
    return stringlist.get(position);

}

public long getItemId(int position){
    return 0;
}

public View getView(final int position, View convertView, @NonNull ViewGroup parent) {
    final ListViewHolder listViewHolder;
    View customView;
    if(convertView == null)
    {
    LayoutInflater menuInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
   // LayoutInflater menuInflater = LayoutInflater.from(getContext());
    customView = menuInflater.inflate(R.layout.item_food, parent, false);
        listViewHolder = new ListViewHolder();
       // final String singlemenuitem = (String) getItem(position);
        listViewHolder.tvfoodname = (TextView) customView.findViewById(R.id.tvfoodname);
        listViewHolder.btnadd = (ImageButton) customView.findViewById(R.id.btnadd);
        listViewHolder.btnminus = (ImageButton) customView.findViewById(R.id.btnminus);
        listViewHolder.etquantity = (EditText) customView.findViewById(R.id.etquantity);
        customView.setTag(listViewHolder);
    }
    else
    {
        customView=convertView;
        listViewHolder= (ListViewHolder) customView.getTag();
    }

  //  listViewHolder.tvfoodname.setText(singlemenuitem);
    final Food foods=(Food)getItem(position);
    listViewHolder.tvfoodname.setText(foods.getFoodname());
    listViewHolder.etquantity.setText(foods.cartQuantity);
    listViewHolder.btnadd.setImageResource(R.drawable.plus);
    listViewHolder.btnadd.setOnClickListener(new View.OnClickListener(){
        @Override
       public void onClick(View v) {
   //   Food.cartQuantity=Integer.parseInt(etquantity.getText().toString().trim());
   //         Food.cartQuantity =  Food.cartQuantity + 1;
   //         etquantity.setText("" +  Food.cartQuantity);
            updateQuantity(position,listViewHolder.etquantity,1);
        }
    });
    listViewHolder.btnminus.setImageResource(R.drawable.minus);
    listViewHolder.btnminus.setOnClickListener(new View.OnClickListener(){
        @Override
     public void onClick(View v) {
   //         Food.cartQuantity = Integer.parseInt(etquantity.getText().toString().trim());
      //      if ( Food.cartQuantity == 0) {
    //            Food.cartQuantity= 0;
   //         } else {
     //           Food.cartQuantity = Food.cartQuantity - 1;
     //       }
      //      etquantity.setText("" + Food.cartQuantity);
            updateQuantity(position,listViewHolder.etquantity,-1);
       }
   });
    return customView;
}

标签: android

解决方案


您只是将foodname作为数组传递给您的适配器,然后尝试将foodname(这是 a string)转换为Food适配器内的对象,这绝对是不可能的。

解决方案:使用创建一个数组列表Food,然后将此数组列表传递给您的适配器

或者如果您只需要打印foodname适配器内部,只需像这样添加

final String foodname=(String)getItem(position);
listViewHolder.tvfoodname.setText(foodname);

*********更新*********

像这样创建一个数组列表

ArrayList<Food> food_data=new ArrayList<>();

然后像这样填充它

JSONArray jsonArray = new JSONArray(json);
for (int i = 0; i < jsonArray.length(); i++) 
{
JSONObject obj = jsonArray.getJSONObject(i);
String name=obj.getString("foodname");
String quantity=obj.getString("add_json_key_for_quantity");
Food food=new Food();
food.setFoodname(name);
food.seCartQuantity(quantity);
food_data.add(food);
}

BaseAdapter ListAdapter = new CustomAdapter(this,food_data);
listView2.setAdapter(ListAdapter);

现在更改适配器构造函数

    ArrayList<Food> food_data=new ArrayList<>();
private Context context;
CustomAdapter(Context context, ArrayList<Food> food_data) {
    //super(context, R.layout.item_food, stringlist);
    this.context = context;
    this.food_data = food_data;
}

现在可以这样访问了

final Food foods=food_data.get(position);
listViewHolder.tvfoodname.setText(foods.getFoodname());
listViewHolder.etquantity.setText(foods.getCartQuantity);
  • 注意:记得声明适当的 getter/setter

推荐阅读