Android Studio实现ListView后应用持续崩溃,求解决方案
解决ListView应用崩溃问题
问题分析与修复步骤:
1. MainActivity 空指针异常(核心崩溃原因)
- 未初始化视图绑定对象
binding就直接调用binding.getRoot(),触发空指针异常。 - 重复调用
setContentView,同时通过布局文件和绑定对象设置布局,逻辑冲突。
修正后的MainActivity代码:
package com.example.listviewassigment; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import com.example.listviewassigment.databinding.ActivityMainBinding; import java.util.ArrayList; public class MainActivity extends AppCompatActivity { ActivityMainBinding binding; MenuAdapter menuAdapter; ArrayList<Menu> dataArrayList = new ArrayList<>(); Menu menu; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 初始化视图绑定 binding = ActivityMainBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); int[] imagedish = {R.drawable.pizza,R.drawable.desert,R.drawable.beverage}; String[] titledish = {"Pizza","Desert","Beverage"}; String[] nodishes = {"5 sản phẩm","3 sản phẩm","6 sản phẩm"}; String[] nodiscounteddishes = {"5 đang giảm giá","3 đang giảm giá","6 đang giảm giá"}; for (int i=0;i< imagedish.length;i++) { menu = new Menu(titledish[i],nodishes[i],nodiscounteddishes[i],imagedish[i]); dataArrayList.add(menu); } menuAdapter = new MenuAdapter(MainActivity.this,dataArrayList); binding.lsMenu.setAdapter(menuAdapter); binding.lsMenu.setClickable(true); } }
2. MenuAdapter 方法重写错误
getView方法返回值不应标注@Nullable,父类ArrayAdapter的getView要求返回非空View。- 混淆了方法参数的视图对象与类成员变量,导致视图复用逻辑错误,应直接使用方法传入的
convertView参数。 - 移除多余的类成员变量
position、view、parent,避免变量冲突。
修正后的MenuAdapter代码:
package com.example.listviewassigment; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import java.util.ArrayList; public class MenuAdapter extends ArrayAdapter<Menu> { public MenuAdapter(@NonNull Context context, @NonNull ArrayList<Menu> dataArrayList) { super(context, R.layout.item_dish, dataArrayList); } @NonNull @Override public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { Menu listmenu = getItem(position); if(convertView == null){ convertView = LayoutInflater.from(getContext()).inflate(R.layout.item_dish, parent, false); } ImageView imagedish = convertView.findViewById(R.id.imagedish); TextView titledish = convertView.findViewById(R.id.titledish); TextView nodishes = convertView.findViewById(R.id.nodishes); TextView nodiscounteddishes = convertView.findViewById(R.id.nodiscounteddishes); imagedish.setImageResource(listmenu.image); titledish.setText(listmenu.name); nodishes.setText(listmenu.nodishes); nodiscounteddishes.setText(listmenu.sale); return convertView; } }
额外检查点
- 确认
item_dish.xml布局文件中存在imagedish、titledish、nodishes、nodiscounteddishes四个控件,且ID完全匹配。 - 检查
R.drawable.pizza、R.drawable.desert、R.drawable.beverage图片已正确放置在res/drawable目录下。
内容的提问来源于stack exchange,提问作者Hera Nguyen
相关产品推荐
相关产品推荐

