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



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

问题:我可以将数据写入编辑器活动中的 Firebase 实时数据库,但在将数据读入 CatalogActivity 中的适配器时遇到问题。由于我在编辑器活动的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中添加一个新的侦听器以正确显示这些项目。

更新 CatalogActivity 中 "onResume((" 方法中的 mPetAdapter 数据。或者使用"观察者模式"监听数据库。

您必须在 CatalogActivity 中创建 Firebase 实例 并实现 Firebase 的addValueEventListeneronDataChange侦听添加/更新新数据时的情况

示例代码

mFirebaseInstance.getReference("abc").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
}
@Override
public void onCancelled(DatabaseError error) {
}
});

相关内容

最新更新