【问题标题】:How to get Firebase Data into a ListView?如何将 Firebase 数据放入 ListView?
【发布时间】:2017-04-14 22:44:35
【问题描述】:

我正在做一个 Android 应用程序。我已经成功写入 Firebase,但是我在从 Firebase 读取到 ListView 时遇到问题。如果有人可以帮助将数据读回到应用程序中的 ListView,如果我只有一个项目可以尝试读回,那么如果我尝试获取所有三个项目,应用程序就会失败。 我已经包含了数据库的图片,以了解结构和我的代码。

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;

import com.firebase.client.DataSnapshot;
import com.firebase.client.Firebase;
import com.firebase.client.FirebaseError;
import com.firebase.client.ValueEventListener;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.FirebaseDatabase;

 import java.util.ArrayList;

 public class Admin_ViewEvent extends AppCompatActivity {

   // private TextView textViewPersons;
private ListView mListView;
private ArrayList<String> mMeetings = new ArrayList<>();
private Firebase mRef;

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

    mRef = new Firebase("https://saica-sgb-77a4f.firebaseio.com/Meetings");
    mListView = (ListView) findViewById(R.id.ListView);
    //textViewPersons = (TextView) findViewById(R.id.textViewPersons);

    final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mMeetings);
    mListView.setAdapter(arrayAdapter);

    mRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot)
        {
            for(DataSnapshot childSnapShot : dataSnapshot.getChildren()) {

                String date = (String) childSnapShot.child("address").getValue();
                String datetime = (String) childSnapShot.child("datetime").getValue();
                String name = (String) childSnapShot.child("name").getValue();

                mMeetings.add(date);
                mMeetings.add(datetime);
                mMeetings.add(name);

            }
        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {
            System.out.println("The read failed: " + firebaseError.getMessage());
        }
    });

 }
}

【问题讨论】:

  • 代码有什么问题?我很快看到的唯一一件事是你没有在onDataChange() 中调用arrayAdapter.notifyDataSetChanged()。我还建议使用ChildEventListener,因为这样可以更精细地更新列表视图,从而减少屏幕闪烁。
  • @FrankvanPuffelen 嗨,我希望将每个项目都放在自己的列表中,因为 Firebase 中的每个项目都成为自己的项目。例如,第一个键 3 个项目必须分组显示。
  • 听起来像是一个清晰的用例。当前代码有什么问题?

标签: java android listview firebase firebase-realtime-database


【解决方案1】:

我想你错过了什么,你应该添加这个

DatabaseReference myRef = FirebaseAuth.getInstance().getReference
.child("Meetings").child(uid);

然后在onDataChange中。

String date = (String) childSnapShot.child("address").getValue();
            String datetime = (String) childSnapShot.child("datetime").getValue();
            String name = (String) childSnapShot.child("name").getValue();

            mMeetings.add(date);
            mMeetings.add(datetime);
            mMeetings.add(name);

【讨论】:

    【解决方案2】:

    使用 ChildEventListener 并输入您的此代码:
    final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String(this,android.R.layout.simple_list_item_1, mMeetings); mListView.setAdapter(arrayAdapter);

    在 onChildAdded....
    还创建模型类以从 firebase 获取数据 public class User {public String name;public String date;public String time;//调用
    // DataSnapshot.getValue(User.class) public User() {}public User(String name, String time, String date) {this.name = name; this.time= time;this.date=date;}
    需要默认构造函数 谢谢它会帮助你..

    【讨论】:

      【解决方案3】:

      您可以使用Firebase UI library

      只需添加依赖即可:

      dependencies {
          // FirebaseUI Database only
          compile 'com.firebaseui:firebase-ui-database:1.0.1'
      }
      

      然后定义一个简单的类来映射你的对象:

      public class MyObject {
      
         private String name;
         private String address;
         private String dateTime;
      
         public MyObject() {
         }
         ....
      
      }
      

      然后使用类似的东西:

      mRef = new Firebase("https://saica-sgb-77a4f.firebaseio.com/Meetings");
      mListView = (ListView) findViewById(R.id.ListView);
      mAdapter = new FirebaseListAdapter<MyObject>(this, MyObject.class, R.layout.myLayout, mRef) {
              @Override
              protected void populateView(View view, MyObject myObj, int position) {
                 //Set the value for the views
                 ((TextView)view.findViewById(R.id.xxx)).setText(myObj.getName());
                 //...
              }
          };
          mListView.setAdapter(mAdapter);
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-18
      相关资源
      最近更新 更多