自定义ListView在模拟器中不显示:界面黑屏问题排查
ListView使用自定义BaseAdapter后黑屏无内容显示
我尝试为Car类实现自定义BaseAdapter来展示ListView,但运行应用后Activity界面黑屏。在activity_main.xml中添加静态文本能正常显示,说明问题出在ListView或setAdapter相关逻辑上。
代码配置
XML布局(activity_main.xml)
<?xml version="1.0" encoding="utf-8"?> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android"> <ListView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/cars_list"/> </LinearLayout>
主Activity代码
package com.example.carscustomadapter; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.widget.ListView; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ListView carsList = findViewById(R.id.cars_list); List<Car> cars = new ArrayList<>(); cars.add(new Car(1000,20,2)); cars.add(new Car(1000,40,2)); cars.add(new Car(1000,60,8)); cars.add(new Car(1000,100,5)); cars.add(new Car(1000,20,2)); cars.add(new Car(1000,40,2)); cars.add(new Car(1000,60,8)); cars.add(new Car(1000,100,5)); cars.add(new Car(1000,20,2)); cars.add(new Car(1000,40,2)); cars.add(new Car(1000,60,8)); cars.add(new Car(1000,100,5)); cars.add(new Car(1000,20,2)); cars.add(new Car(1000,40,2)); cars.add(new Car(1000,60,8)); cars.add(new Car(1000,100,5)); CarsAdapter carsAdapter = new CarsAdapter(cars); carsList.setAdapter(carsAdapter); } }
自定义Adapter(CarsAdapter)代码
public class CarsAdapter extends BaseAdapter implements View.OnClickListener { private List<Car> cars; public CarsAdapter(List<Car> cars) { this.cars = cars; } @Override public int getCount() { return 0; } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } @Override public View getView(int i, View view, ViewGroup viewGroup) { if (view == null) view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.car_layout, viewGroup, false); TextView kmTv = view.findViewById(R.id.km_tv); TextView fuelTv = view.findViewById(R.id.fuel_tv); Button driveBtn = view.findViewById(R.id.drive_btn); driveBtn.setTag(i); Car car = cars.get(i); kmTv.setText(car.getMileage() + ""); fuelTv.setText(car.getFuel() + ""); driveBtn.setOnClickListener(this); return view; } @Override public void onClick(View v) { LinearLayout root = (LinearLayout) v.getParent(); EditText editText = root.findViewById(R.id.km_et); Car car = cars.get((Integer) v.getTag()); car.drive(Integer.parseInt(editText.getText().toString())); notifyDataSetChanged(); } }
问题现象
运行应用后屏幕黑屏,ListView无任何内容显示。
怀疑方向
- Adapter的配置或实现
- 提供给ListView的数据有误
- car_layout.xml布局存在问题(未提供但可能相关)
已尝试操作
- 在activity_main.xml中添加静态文本,确认布局可正常渲染
- 确认setAdapter()已被调用
- 尝试调试应用,但无法定位问题
期望效果
ListView能加载并显示Car对象的列表行,每行展示里程、油量信息及操作按钮。
修复方案
- 修正getCount()方法:
ListView通过getCount()判断数据源数量,当前返回0会导致无列表项渲染,修改为:
@Override public int getCount() { return cars != null ? cars.size() : 0; }
- 修正getItem()和getItemId()方法:
这两个方法需要正确返回对应位置的数据,否则可能引发后续逻辑异常:
@Override public Object getItem(int position) { return cars.get(position); } @Override public long getItemId(int position) { return position; // 若Car类有唯一ID,可替换为car.getId() }
- 额外检查项:
- 确认
car_layout.xml存在,且其中的km_tv、fuel_tv、drive_btn、km_et等控件ID拼写正确 - 可在
getView()中添加日志输出,验证该方法是否被调用,确认修复效果
- 确认
内容的提问来源于stack exchange,提问作者Yonatan Shkolsky
相关产品推荐
相关产品推荐

