【发布时间】:2021-12-11 01:29:23
【问题描述】:
我制作了一个从 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` :
公共类 DisplayInformations 扩展 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 上的最后数据”是什么意思?这段代码中究竟有什么不能按您期望的方式工作?告诉我们共享代码有什么问题。你有什么错误吗?
-
@AlexMamo 确实没有错误但问题出在
setOnItemClickListener -
那里到底发生了什么?
-
请澄清您的具体问题或提供其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。
-
@AlexMamo 问题是,当我单击 listView 中的某个项目时,displayInformation 文件会打开,但会显示最后上传到 firebase 的数据,并且不会显示 listView 中每个项目的数据
标签: java android firebase firebase-realtime-database google-cloud-platform