如何使用 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 检索数据?

从 firebase 检索数据后获取空白 ListView

在 Flutter 中的 ListView 中搜索(使用 Firebase 中的数据)

在 Flutter 中将 Firebase 数据作为 Listview 构建器获取

使用 firebase 在 listview 中显示所有用户图像

Firebase - 显示到 ListView