Получать данные Firebase и отображать их в ListView в Android Studio - PullRequest
0 голосов
/ 04 сентября 2018

В настоящее время я создаю приложение для Android и использую Firebase в качестве своей базы данных, однако у меня возникают трудности с получением данных и отображением их в ListView. Я попробовал несколько кодов, но приложение перестало работать, как только я отображаю активность в списке.

Ниже приведен скриншот моей базы данных, а также мой код и ошибка, которую я получаю при попытке запуска:

База данных Firebase

enter image description here

public class ClientLIstActivity extends AppCompatActivity {

private Button clientSelect;
private ListView clientlistView;
private FirebaseDatabase database;
private DatabaseReference databaseReference;

private ArrayList<String> list = new ArrayList<String>();
private ArrayAdapter<String> adapter;

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

    clientlistView = (ListView) findViewById(R.id.clientListView);
    adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,list);
    clientlistView.setAdapter(adapter);
    adapter.notifyDataSetChanged();
    databaseReference = FirebaseDatabase.getInstance().getReference().child("Clients");


    clientSelect = (Button) findViewById(R.id.selectClient);

    clientSelect.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            onBackPressed();
        }
    });

    databaseReference.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
           String value = dataSnapshot.getValue(String.class);
           list.add(value);
        }

        @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) {

        }
    });
}


}

Журнал ошибок:

E/AndroidRuntime: FATAL EXCEPTION: main
              Process: com.javytharanee.quicksolattendance, PID: 6602
              com.google.firebase.database.DatabaseException: Failed to convert value of type java.util.HashMap to String
                  at com.google.android.gms.internal.zzepg.zzb(Unknown Source:93)
                  at com.google.android.gms.internal.zzepg.zza(Unknown Source:0)
                  at com.google.firebase.database.DataSnapshot.getValue(Unknown Source:10)
                  at com.javytharanee.quicksolattendance.ClientLIstActivity$2.onChildAdded(ClientLIstActivity.java:53)
                  at com.google.android.gms.internal.zzegg.zza(Unknown Source:71)
                  at com.google.android.gms.internal.zzelk.zzcal(Unknown Source:2)
                  at com.google.android.gms.internal.zzelq.run(Unknown Source:71)
                  at android.os.Handler.handleCallback(Handler.java:873)
                  at android.os.Handler.dispatchMessage(Handler.java:99)
                  at android.os.Looper.loop(Looper.java:193)
                  at android.app.ActivityThread.main(ActivityThread.java:6669)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

Класс объекта клиента:

public class Client {
String name;
String location;
String latitude;
String longitude;

public Client(String location, String latitude, String longitude) {
    this.location = location;
    this.latitude = latitude;
    this.longitude = longitude;
}

public Map toMap() {
    Map client = new HashMap();

    client.put("Name", this.name);
    client.put("Location", this.location);
    client.put("Latitude", this.latitude);
    client.put("Longitude", this.longitude);

    return client;
}

public void setName(String name) {
    this.name = name;
}
}

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

создайте POJO класс ArrayList и добавьте его в свой список, проверьте код ниже

    public class ClientLIstActivity extends AppCompatActivity {

private Button clientSelect;
private ListView clientlistView;
private FirebaseDatabase database;
private DatabaseReference databaseReference;

private ArrayList<Client> list = new ArrayList>(); // 1=change here
private ArrayAdapter<String> adapter;

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

    clientlistView = (ListView) findViewById(R.id.clientListView);
    adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,list);
    clientlistView.setAdapter(adapter);
    adapter.notifyDataSetChanged();
    databaseReference = FirebaseDatabase.getInstance().getReference().child("Clients");


    clientSelect = (Button) findViewById(R.id.selectClient);

    clientSelect.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            onBackPressed();
        }
    });

    databaseReference.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
           Client value = dataSnapshot.getValue(Client.class);  // 2=change here
           list.add(value);
        }

        @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) {

        }
    });
}


}
0 голосов
/ 04 сентября 2018

Вы получаете эту ошибку, потому что скучаете по ребенку. Чтобы решить эту проблему, измените следующую строку кода:

String value = dataSnapshot.getValue(String.class);

до

String value = dataSnapshot.child("Name").getValue(String.class);

Выводом в ваш логат будут имена всех клиентов.

P.S. Также имейте в виду, что в вашем проекте вы столкнетесь с другими ошибками, поскольку имена ваших полей в вашем классе Client все строчные, а в вашей базе данных все начинаются с заглавной буквы. Имя должно быть таким же. Пожалуйста, посмотрите также здесь .

public class Client {
    private String name, location, latitude, longitude;

    public Client() {}

    public Client(String name, String location, String latitude, String longitude) {
        this.name = name;
        this.location = location;
        this.latitude = latitude;
        this.longitude = longitude;
    }

    public String getName() { return name; }
    public String getLocation() { return location; }
    public String getLatitude() { return latitude; }
    public String getLongitude() { return longitude; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...