You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义ListView无法显示两项且Activity崩溃问题求助

问题排查与解决方案

我来帮你梳理下导致崩溃和数据无法显示的几个关键问题,以及对应的修复方案:

1. 数据类型强转错误(直接触发崩溃)

你从Firebase获取的是String类型的数据(通过getValue(String.class)),但在CustomAdapter的getView方法里,却强行把main和sub中的元素转成Integer,这会直接抛出ClassCastException,导致Activity崩溃。

修复后的CustomAdapter代码

public class CustomAdapter extends ArrayAdapter<String>{ 
    private final Activity context; 
    private final ArrayList<String> main; 
    private final ArrayList<String> sub; 

    public CustomAdapter(Activity context, ArrayList<String> main, ArrayList<String> sub) { 
        super(context, R.layout.colortext, main); 
        this.context = context; 
        this.main = main; 
        this.sub = sub; 
    } 

    @Override 
    public View getView(int position, View view, ViewGroup parent) { 
        LayoutInflater inflater = context.getLayoutInflater(); 
        // 这里建议传入parent参数,避免布局参数适配问题
        View rowView= inflater.inflate(R.layout.colortext, parent, false); 
        
        TextView txtTitle = rowView.findViewById(R.id.textmain); 
        TextView txtSub = rowView.findViewById(R.id.address); 
        
        // 直接使用String类型,无需强转
        txtTitle.setText(main.get(position)); 
        txtSub.setText(sub.get(position)); 
        
        return rowView; 
    } 
}

2. 自定义列表项布局错误

你的colortext.xml里错误地包含了ListView——这个布局是用来定义单个列表条目的UI,而不是整个页面的布局。每个条目只需要展示当前行的控件(两个TextView和CheckBox)即可。

修复后的colortext.xml代码

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="8dp"> <!-- 增加内边距优化视觉效果 -->

    <TextView
        android:id="@+id/textmain"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_vertical"
        android:minHeight="?android:attr/listPreferredItemHeight"
        android:paddingLeft="6dip"
        android:paddingRight="10dip"
        android:textSize="23sp" <!-- 文字大小建议用sp,适配不同屏幕 -->
        android:textColor="#01B9F5"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <CheckBox
        android:id="@+id/checkBox"
        android:clickable="true"
        android:gravity="center_vertical"
        android:minHeight="?android:attr/listPreferredItemHeight"
        android:paddingLeft="6dip"
        android:paddingRight="10dip"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:focusable="false" />

    <TextView
        android:id="@+id/address"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textmain" <!-- 调整为在主文本下方,布局更合理 -->
        android:paddingLeft="6dip"
        android:textColor="@color/white"/>
</RelativeLayout>

3. Adapter设置时机错误

你在Firebase数据遍历的循环里,每次都创建新的CustomAdapter并设置给ListView,这不仅会导致重复刷新,还可能引发数据混乱。正确的做法是:等所有数据都添加到main和sub集合后,再一次性创建Adapter并设置。

修复后的MainActivity相关代码

// 先在Activity的成员变量中初始化集合,避免每次数据变化都重新创建
private ArrayList<String> main = new ArrayList<>();
private ArrayList<String> sub = new ArrayList<>();

// Firebase数据监听逻辑
mDatabase.child("users").child(mUserId).child("locs").addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        // 每次数据更新时先清空旧数据,避免重复添加
        main.clear();
        sub.clear();
        
        for(DataSnapshot ds: dataSnapshot.getChildren()) {
            String title = ds.child("title").getValue(String.class);
            String addr = ds.child("addr").getValue(String.class);
            // 判空避免空指针
            if(title != null) main.add(title);
            if(addr != null) sub.add(addr);
        }
        
        // 循环结束后统一设置Adapter
        ListView list = findViewById(R.id.listView1);
        CustomAdapter adapter2 = new CustomAdapter(Location.this, main, sub);
        list.setAdapter(adapter2);
    }

    @Override
    public void onCancelled(@NonNull DatabaseError error) {
        // 别忘了处理取消事件,方便排查问题
        Log.e("FirebaseError", error.getMessage());
    }
});

另外需要注意:你需要把ListView(id为listView1)放到Activity的主布局中,而不是之前的条目布局里,这样才能正确承载所有列表条目。

内容的提问来源于stack exchange,提问作者Prismere

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:24:01