Android接入Firebase后点击ListView子项仅显示最后一条数据如何解决
问题根因
你现在出现这个问题核心是两个错误:
- 你在MainActivity里把firstName、lastName、age、description定义成了全局变量,遍历Firebase数据的时候每次循环都会覆盖这四个变量的值,等遍历结束后这四个变量存的永远是最后一条数据的内容。
- ListView的点击事件里你直接传了这四个全局变量的值,所以不管点哪个子项,传到详情页的都是最后一条数据的内容。
另外你的详情页还有一个隐藏的空指针风险:你先调用了loadListDetails()给控件赋值,之后才执行findViewById初始化控件,赋值的时候控件还没创建,会直接崩溃。
修复步骤
第一步:修改MainActivity代码
- 先删掉MainActivity里定义的四个全局属性:
// 删掉下面这四行全局定义 private String firstName; private String lastName; private String age; private String description;
- 把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(); }
- 修改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
相关产品推荐
相关产品推荐

