如何使用 firebase 获取 listView 中每个项目的数据?
Posted
技术标签:
【中文标题】如何使用 firebase 获取 listView 中每个项目的数据?【英文标题】:How can I get the data for each item in the listView using firebase? 【发布时间】: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 中每个项目的数据
【参考方案1】:
数据是从 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);
【讨论】:
我喜欢你的解释,你能回复这个帖子吗? ***.com/questions/69742132/… 我去看看,如果我知道答案,我会写信给你。 非常感谢以上是关于如何使用 firebase 获取 listView 中每个项目的数据?的主要内容,如果未能解决你的问题,请参考以下文章
单击 Listview 中的项目时,如何在新活动中从 Firebase 检索数据?
在 Flutter 中的 ListView 中搜索(使用 Firebase 中的数据)
在 Flutter 中将 Firebase 数据作为 Listview 构建器获取