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

从Firebase取数据到ViewPager2时遇类型转换及字段匹配错误求助

Firebase数据解析错误解决:HashMap转String/No setter/field问题

我在应用中用ViewPager2展示带图片、名称、国家的推荐内容,但从Firebase取数据时先碰到**"Failed to convert value of type java.util.HashMap to String"错误,调整代码后又变成"No setter/field for a class"**,卡了好几天解决不了,求帮助。


MainActivity核心代码

database = FirebaseDatabase.getInstance().getReference();
DatabaseReference myRef = database.child("Packages");
recommendList = new ArrayList<Recommendation>();
adapter = new RecommendAdapter(this, recommendList);
recommendViewPager.setAdapter(adapter);
setupRecommendViewPager();

myRef.addValueEventListener(new ValueEventListener() {
    List<Recommendation> recommendList = new ArrayList<>();
    @Override
    public void onDataChange(@NonNull DataSnapshot snapshot) {
        for (DataSnapshot dataSnapshot : snapshot.getChildren()){
            Recommendation recommendation = dataSnapshot.getValue(Recommendation.class);
            //String recommendation = dataSnapshot.getValue(String.class);
            recommendList.add(recommendation);
        }
        adapter.notifyDataSetChanged();
    }

    @Override
    public void onCancelled(@NonNull DatabaseError error) {
    }
});

Recommendation实体类代码

public class Recommendation {
    public String package_attractions;
    public String package_availability;
    public String package_country;
    public String package_description;
    public String package_name;
    public String package_photos;
    public Double package_price;
    public Double package_rating;
    public String package_region;
    public String package_video;

    public Recommendation(){}

    public Recommendation(String package_attractions, String package_availability, String package_country, String package_description, String package_name, String package_photos, Double package_price, Double package_rating, String package_region, String package_video) {
        this.package_attractions = package_attractions;
        this.package_availability = package_availability;
        this.package_country = package_country;
        this.package_description = package_description;
        this.package_name = package_name;
        this.package_photos = package_photos;
        this.package_price = package_price;
        this.package_rating = package_rating;
        this.package_region = package_region;
        this.package_video = package_video;
    }

    public String getPackage_attractions() {
        return package_attractions;
    }

    public void setPackage_attractions(String package_attractions) {
        this.package_attractions = package_attractions;
    }

    public String getPackage_availability() {
        return package_availability;
    }

    public void setPackage_availability(String package_availability) {
        this.package_availability = package_availability;
    }
    // 其他getter/setter省略
}

问题原因及解决步骤

错误根源

  1. 第一个错误:Firebase中package_photos字段是Map/数组类型,但实体类里定义成String类型,导致Gson解析时无法将HashMap转为String。
  2. 第二个错误:调整代码后出现字段名不匹配、实体类缺少对应getter/setter,导致Firebase找不到解析目标。

针对性修复

1. 修正package_photos类型匹配

根据Firebase中该字段的实际结构修改实体类:

  • 如果是多图片URL列表:
public List<String> package_photos;

public List<String> getPackage_photos() {
    return package_photos;
}
public void setPackage_photos(List<String> package_photos) {
    this.package_photos = package_photos;
}
  • 如果是键值对Map:
public Map<String, String> package_photos;

public Map<String, String> getPackage_photos() {
    return package_photos;
}
public void setPackage_photos(Map<String, String> package_photos) {
    this.package_photos = package_photos;
}

2. 修正数据集合引用问题

内部重新定义的recommendList会导致适配器无法获取新数据,删除内部定义,直接使用外部列表:

myRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot snapshot) {
        recommendList.clear(); // 清空旧数据避免重复
        for (DataSnapshot dataSnapshot : snapshot.getChildren()){
            Recommendation recommendation = dataSnapshot.getValue(Recommendation.class);
            recommendList.add(recommendation);
        }
        adapter.notifyDataSetChanged();
    }

    @Override
    public void onCancelled(@NonNull DatabaseError error) {
        Log.e("FirebaseError", error.getMessage()); // 添加错误日志方便排查
    }
});

3. 确保字段与Firebase完全匹配

  • 检查Firebase字段名和实体类字段名大小写、拼写完全一致;
  • 保证所有字段都有对应的getter/setter,无参构造函数必须存在(已满足)。

4. 可选:简化实体类(仅保留需要的字段)

如果只需要图片、名称、国家信息,可精简实体类:

public class Recommendation {
    public String package_country;
    public String package_name;
    public List<String> package_photos;

    public Recommendation(){}

    // 对应构造函数、getter/setter
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 09:25:29