[英]How can I get the data for each item in the listView using firebase?
我制作了一個從 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 異步加載。 這意味着它需要一些時間才能在您的應用程序中可用。 將這些變量設置為全局變量並不能解決問題。 您需要做的是從適配器獲取數據作為Informatin
類型的對象,然后將其添加到您的 Intent 對象中。 假設您已經為每個字段設置了 getter,請使用以下代碼行:
listView.setOnItemClickListener((parent, view, position, id) -> {
Informatin informatin = (Informatin) parent.getAdapter().getItem(position);
Intent intent = new Intent(MainActivity.this, DisplayInformations.class);
intent.putExtra("firstName", informatin.getFirstName());
intent.putExtra("lastName", informatin.getLastName());
intent.putExtra("age", informatin.getAge());
intent.putExtra("description", informatin.getDescription());
startActivity(intent);
});
或者您可以將整個Informatin
對象添加到 Intent,而不是單獨添加每個字段。 要取回它,只需使用Intent#getSerializableExtra()方法。
另請注意,數據庫中的age
字段是數字而不是字符串。 所以請更改:
private String age;
進入:
private long age;
和:
age = snapshot.child("age").getValue().toString();
進入:
age = snapshot.child("age").getValue(Long.class);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.