在一个活动中将数据写入 firebase 实时数据库并在另一个活动中读取数据

克里斯托弗·顾

应用前提:CatalogActivity 显示已输入并存储在 Firebase 实时数据库中的宠物列表。它有一个指向 EditorActivity 的浮动操作按钮,该按钮允许用户插入有关宠物的信息并将其添加到 CatalogActivity 的列表中。

问题:我可以将数据写入 EditorActivity 中的 Firebase 实时数据库,但无法将数据读入 CatalogActivity 中的适配器。由于我在 EditorActivity 的 onCreate 中定义并附加了我的 childEventListener,因此当我第一次打开应用程序时,目录布局是空的,直到我单击浮动操作按钮。当我第一次打开应用程序时,我将如何使所有数据都显示在目录布局中?我正在考虑实例化 CatalogActivity 中的所有 firebase 变量,然后将它们设为静态公共,以便 EditorActivity 可以在必要时使用它们。那行得通吗?

目录活动

public class CatalogActivity extends AppCompatActivity {

    private ListView mPetListView;
    public static PetAdapter mPetAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_catalog);

        // Initialize reference to views
        mPetListView = (ListView) findViewById(R.id.list);
        View emptyView = findViewById(R.id.empty_view);
        mPetListView.setEmptyView(emptyView);

        // Initialize pet ListView and its adapter
        List<Pet> pets = new ArrayList<>();
        mPetAdapter = new PetAdapter(this, R.layout.list_item, pets);
        mPetListView.setAdapter(mPetAdapter);

        // Setup FAB to open EditorActivity
        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(CatalogActivity.this, EditorActivity.class);
                startActivity(intent);
            }
        });
    }
...
}

编辑活动

public class EditorActivity extends AppCompatActivity{

    // EditText fields to enter the pet's name, breed, weight, and gender
    private EditText mNameEditText;
    private EditText mBreedEditText;
    private EditText mWeightEditText;
    private Spinner mGenderSpinner;

    // Gender of the pet. The possible values are 0 for unknown, 1 for male, and 2 for female
    private int mGender = 0;

    ...

    private Pet mPet;

    // Firebase instance variables
    private FirebaseDatabase mFirebaseDatabase;
    private DatabaseReference mDatabaseReference;
    private ChildEventListener mChildEventListener;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_editor);

        mFirebaseDatabase = FirebaseDatabase.getInstance();
        mDatabaseReference = mFirebaseDatabase.getReference().child("pets");

        ...

        // Find all relevant views that we will need to read user input from
        mNameEditText = (EditText) findViewById(R.id.edit_pet_name);
        mBreedEditText = (EditText) findViewById(R.id.edit_pet_breed);
        mWeightEditText = (EditText) findViewById(R.id.edit_pet_weight);
        mGenderSpinner = (Spinner) findViewById(R.id.spinner_gender);

        // Setup OnTouchListeners on all the input fields, so we can determine if the user
        // has touched or modified them. This will let us know if there are unsaved changes
        // or not, if the user tries to leave the editor without saving.
        mNameEditText.setOnTouchListener(mTouchListener);
        mBreedEditText.setOnTouchListener(mTouchListener);
        mWeightEditText.setOnTouchListener(mTouchListener);
        mGenderSpinner.setOnTouchListener(mTouchListener);

        setupSpinner();

        mChildEventListener = new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                mPet = dataSnapshot.getValue(Pet.class);
                PetAdapter petAdapter = CatalogActivity.mPetAdapter;
                petAdapter.add(mPet);
            }

            @Override
            public void onChildChanged(DataSnapshot dataSnapshot, String s) {}

            @Override
            public void onChildRemoved(DataSnapshot dataSnapshot) {}

            @Override
            public void onChildMoved(DataSnapshot dataSnapshot, String s) {}

            @Override
            public void onCancelled(DatabaseError databaseError) {}
        };
        mDatabaseReference.addChildEventListener(mChildEventListener);
    }
...
}
亚历克斯·马莫

如果不使用侦听器,则无法显示 Firebase 数据库中的数据,这就是 ListView 为空的原因。因此,您需要做的就是在您的中添加一个新的侦听器以EditorActivity正确显示这些项目。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

仅在 firebase 实时数据库中的一个节点上禁用读取规则

使用来自 Firebase 实时数据库的查询数据作为另一个函数的输入

创建具有相同ID的另一个节点后,如何从Firebase实时数据库中删除一个节点

仅Firebase实时数据库DataSnapshot读取子级中的最后一个值

如何将记录从某个位置复制到Firebase实时数据库中的另一个位置?

访问firebase实时数据库中孩子的最后一个孩子

为什么我的应用程序将其数据发送到另一个 Firebase 实时数据库

在一个查询中从 Firebase 实时数据库的多个引用中获取数据 javascript

如何从Android中的firebase实时数据库中获取最后一个数据

Firebase数据库规则:无法读取另一个集合

Firebase实时数据库同时预订一个时隙(覆盖问题)

Firebase 实时数据库只保留一个文件夹?

使用 ID 从另一个活动中的 SQLite 数据库读取数据

如何在实时数据库Firebase中获取第一个子节点

从子节点Firebase实时数据库Swift 4中检索最后一个子

如何在另一个DataSnapshot中访问Firebase数据库值

如何从Firebase实时数据库获取数据并更改一个文本字段以表示该特定记录?

如果Firebase数据库没有子值,则开始下一个活动

Firebase/Android - 检查数据库中的数据是否与同一数据库中的另一个数据匹配

如何从android studio的firebase实时数据库中的listview中的第一个获取最后添加的数据

可以在一个项目中创建许多Firebase实时数据库实例(> 20)吗

Firebase Web 创建用户并在实时数据库中写入数据无法正常工作

Firebase 数据库规则以防止与另一个节点相关的删除

将Firebase数据库阵列返回到另一个函数,但返回空

当一个函数需要前一个函数的值时,用于 Firebase 实时数据库查找的完成处理程序

从firebase数据库中删除一个值

如何以编程方式将对象放入 firebase 数据库中的另一个对象中?

即使使用 Firebase 实时数据库在 React 中返回了一个值,为什么我仍然“未定义”?

Firebase实时数据库读取数据