如何通过Intent传递FirebaseRecyclerOption/RecyclerView选中项到其他Activity?
问题根源
- 列表点击事件获取狗狗名称的逻辑错误:
findViewById(R.id.dogName)默认从Activity全局布局查找控件,只会返回列表第一个加载的狗狗名称控件的值,因此每次传递给DogProfile的名字都是固定的Finn。 - ChooseDog点击事件中多余调用了仅属于DogProfile的
getDogData()方法,无实际作用。
修复代码
修改ChooseDog列表点击逻辑
从点击的列表项视图v中查找名称控件,删除无效调用,代码如下:
ItemClickSupport.addTo(recyclerView).setOnItemClickListener( new ItemClickSupport.OnItemClickListener() { @Override public void onItemClicked(RecyclerView recyclerView, int position, View v) { // 从当前点击的列表项视图中查找dogName控件 TextView dogName = v.findViewById(R.id.dogName); Intent intent = new Intent(ChooseDog.this, DogProfile.class); intent.putExtra("name", dogName.getText().toString()); startActivity(intent); } } );
更稳妥的实现方式是直接从Adapter中取对应位置的Dog对象获取名称,避免控件显示内容和实际数据不一致的问题:
ItemClickSupport.addTo(recyclerView).setOnItemClickListener( new ItemClickSupport.OnItemClickListener() { @Override public void onItemClicked(RecyclerView recyclerView, int position, View v) { Dog clickedDog = dogUserAdapter.getItem(position); Intent intent = new Intent(ChooseDog.this, DogProfile.class); intent.putExtra("name", clickedDog.getName()); startActivity(intent); } } );
优化DogProfile查询逻辑(可选)
你已通过orderByChild("name").equalTo(dogsName)做了数据过滤,返回结果必然是名称匹配的节点,无需再做二次相等判断,同时优化空值处理逻辑:
private void getDogData() { DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("user").child(uid).child("dogs"); // 直接调用getStringExtra避免Extras为空时的空指针异常 String dogsName = getIntent().getStringExtra("name"); Query query = databaseReference.orderByChild("name").equalTo(dogsName); query.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { if (dataSnapshot.exists()) { for (DataSnapshot ds : dataSnapshot.getChildren()) { String name = ds.child("name").getValue(String.class); String dogBreed = ds.child("breed").getValue(String.class); String dogAge = ds.child("age").getValue(String.class); String gender = ds.child("gender").getValue(String.class); String dogWeight = ds.child("weight").getValue(String.class); String neutered = ds.child("neutered").getValue(String.class); dogName.setText(name); breed.setText(dogBreed); age.setText(dogAge); dogGender.setText(gender); weight.setText(dogWeight); isNeutered.setText(neutered); } } else { Toast.makeText(DogProfile.this, "未找到对应狗狗信息,请重试", Toast.LENGTH_SHORT).show(); } } @Override public void onCancelled(DatabaseError databaseError) { Log.w("TAG", "onCancelled", databaseError.toException()); } }); }
内容的提问来源于stack exchange,提问作者Caitlin
相关产品推荐
相关产品推荐

