如何使用firebase获得listView中每个项目的数据?



我已经制作了一个应用程序,从Firebase获取数据,我想当我点击listView时,它向我显示了每个项目的数据,但问题是,当我点击listView中的一个项目时,displayInformation文件打开,但显示上传到Firebase的最后数据,不显示ListView中每个项目的数据。

这是Firebase数据:

{
"List" : {
"-Mmi2obH5ji14w82qUhR" : {
"age" : 22,
"description" : "blah",
"firstName" : "John",
"lastName" : "Michael"
},
"-MmiDkIXb_vLqET8BmKX" : {
"age" : 24,
"description" : "blah",
"firstName" : "Leonardo",
"lastName" : ""
},
"-MmnL1PYbcyW9VJPytr3" : {
"age" : 19,
"description" : "blah",
"firstName" : "Mohamed",
"lastName" : ""
}
}
}

这些是我的代码:

这是MainActivity的代码:
public class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<Cursor> {
private static final int LIST_APP_LOADER = 0;
ArrayList<Informatin> listItem;
ListView listView;
listAppAdapter adapter;
DatabaseReference reference;
private String firstName;
private String lastName;
private String age;
private String description;
ArrayList<Informatin> mInformation;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listItem = new ArrayList<>();
listView = findViewById(R.id.list);
listView.setTextFilterEnabled(true);
listView.setOnItemClickListener((parent, view, position, id) -> {
Intent intent = new Intent(MainActivity.this, DisplayInformations.class);
intent.putExtra("firstName", firstName);
intent.putExtra("lastName", lastName);
intent.putExtra("age", age);
intent.putExtra("description", description);
startActivity(intent);
});
LoaderManager.getInstance(this).initLoader(LIST_APP_LOADER, null, this);
mInformation = new ArrayList<>();
adapter = new listAppAdapter(this, mInformation);
listView.setAdapter(adapter);
reference = FirebaseDatabase.getInstance().getReference("List");
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
mInformation.clear();
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
firstName = snapshot.child("firstName").getValue().toString();
lastName = snapshot.child("lastName").getValue().toString();
age = snapshot.child("age").getValue().toString();
description = snapshot.child("description").getValue().toString();
Informatin informatin = new Informatin(firstName, lastName, description, age);
mInformation.add(informatin);
}
adapter.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.menu_main_screen, menu);
return true;
}
@NonNull
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
return null;
}
@Override
public void onLoadFinished(@NonNull Loader<Cursor> loader, Cursor data) {
adapter.notifyDataSetChanged();
}
@Override
public void onLoaderReset(@NonNull Loader<Cursor> loader) {
return null;
}
}
this codes for `displayInformation` :

公共类displayinformation扩展AppCompatActivity实现LoaderManager。LoaderCallbacks {

private Uri mCurrentPersonUri;
private TextView mNameDisplay;
private TextView mAgeDisplay;
private TextView mDescriptionDisplay;
private ImageView mImageTopBar;
private Toolbar mToolbar;
private String firstName;
private String lastName;
private String age;
private String description;
private static final int EXISTING_LIST_APP_LOADER = 0;
@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();
loadListDetails();
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);
LoaderManager.getInstance(this).initLoader(EXISTING_LIST_APP_LOADER, null, this);
}
private void loadListDetails() {
String name = firstName + " " + lastName;
int ageInt = Integer.parseInt(age);
setTitle(name);
mNameDisplay.setText(name);
if (age.equals("1")) {
String ageDisplay = getString(R.string.age) + ": " + getString(R.string.one_year);
mAgeDisplay.setText(ageDisplay);
} else if (age.equals("2")) {
String ageDisplay = getString(R.string.age) + ": " + getString(R.string.two_year);
mAgeDisplay.setText(ageDisplay);
} else if (ageInt >= 3 && ageInt <= 10) {
String ageDisplay = getString(R.string.age) + ": " + age + getString(R.string.years);
mAgeDisplay.setText(ageDisplay);
} else if (ageInt >= 11) {
String ageDisplay = getString(R.string.age) + ": " + age + getString(R.string.year);
mAgeDisplay.setText(ageDisplay);
}
mDescriptionDisplay.setText(description);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.menu_display_informations, menu);
return true;
}
@NonNull
@Override
public Loader<Cursor> onCreateLoader(int id, @Nullable Bundle args) {
return null;
}
@Override
public void onLoadFinished(@NonNull Loader<Cursor> loader, Cursor cursor) {
if (cursor == null || cursor.getCount() < 1) {
return;
}
if (cursor.moveToFirst()) {
loadListDetails();
setSupportActionBar(mToolbar);
}
}
@Override
public void onLoaderReset(@NonNull Loader<Cursor> loader) {
mNameDisplay.setText("");
mAgeDisplay.setText("");
mDescriptionDisplay.setText("");
}

}

<代码>

数据是从Firebase异步加载的。这意味着它需要一段时间才能在你的应用程序中可用。将这些变量设置为全局并不能解决问题。你需要做的是,从适配器获取数据作为Informatin类型的对象,然后将它添加到你的Intent对象。假设您已经为每个字段设置了getter,请使用以下代码行:

private String age;

或者你可以将整个age对象添加到Intent中,而不是单独添加每个字段。要获取它,只需使用Intent#getSerializableExtra()方法。

还请注意,数据库中的CC_9字段是一个数字,而不是一个字符串。所以请更改:

private long age;

为:

age = snapshot.child("age").getValue().toString();

:

age = snapshot.child("age").getValue(Long.class);

为:

PP_10

最新更新