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

Android接入Firebase后点击ListView子项仅显示最后一条数据如何解决

问题根因

你现在出现这个问题核心是两个错误:

  1. 你在MainActivity里把firstName、lastName、age、description定义成了全局变量,遍历Firebase数据的时候每次循环都会覆盖这四个变量的值,等遍历结束后这四个变量存的永远是最后一条数据的内容。
  2. ListView的点击事件里你直接传了这四个全局变量的值,所以不管点哪个子项,传到详情页的都是最后一条数据的内容。
    另外你的详情页还有一个隐藏的空指针风险:你先调用了loadListDetails()给控件赋值,之后才执行findViewById初始化控件,赋值的时候控件还没创建,会直接崩溃。

修复步骤

第一步:修改MainActivity代码

  1. 先删掉MainActivity里定义的四个全局属性:
// 删掉下面这四行全局定义
private String firstName;
private String lastName;
private String age;
private String description;
  1. 把Firebase数据遍历逻辑里的四个变量改成局部变量:
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
    mInformation.clear();
    for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
        // 改成局部变量,每次循环自己存自己的,不污染全局
        String firstName = snapshot.child("firstName").getValue().toString();
        String lastName = snapshot.child("lastName").getValue().toString();
        String age = snapshot.child("age").getValue().toString();
        String description = snapshot.child("description").getValue().toString();

        Informatin informatin = new Informatin(firstName, lastName, description, age);
        mInformation.add(informatin);
    }
    adapter.notifyDataSetChanged();
}
  1. 修改ListView的点击事件,根据点击的position从数据源里取对应的数据传值:
listView.setOnItemClickListener((parent, view, position, id) -> {
    // 拿当前点击位置对应的实体类
    Informatin currentItem = mInformation.get(position);
    Intent intent = new Intent(MainActivity.this, DisplayInformations.class);
    intent.putExtra("firstName", currentItem.getFirstName());
    intent.putExtra("lastName", currentItem.getLastName());
    intent.putExtra("age", currentItem.getAge());
    intent.putExtra("description", currentItem.getDescription());
    startActivity(intent);
});

注意:上面的get方法需要你的Informatin实体类已经写了对应的getter方法,如果没写的话先给Informatin类补上四个属性对应的get方法。

第二步:修改DisplayInformations代码

调整初始化顺序,先初始化控件再调用loadListDetails赋值:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_display_informations);

    // 先拿传过来的值
    Intent intent = getIntent();
    firstName = intent.getStringExtra("firstName");
    lastName = intent.getStringExtra("lastName");
    age = intent.getStringExtra("age");
    description = intent.getStringExtra("description");
    mCurrentPersonUri = intent.getData();

    // 先初始化所有控件
    mNameDisplay = findViewById(R.id.name_display);
    mAgeDisplay = findViewById(R.id.age_display);
    mDescriptionDisplay = findViewById(R.id.description_display);
    mImageTopBar = findViewById(R.id.image_top_bar);
    mToolbar = findViewById(R.id.main_toolbar);

    // 控件初始化完成后再赋值
    loadListDetails();

    LoaderManager.getInstance(this).initLoader(EXISTING_LIST_APP_LOADER, null, this);
}

修改完成后即可实现点击对应子项展示对应条目的数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 14:45:07