Пытаясь получить значения из базы данных Firebase Realtime

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

Когда я нажимаю на пользователя в списке, мне нужно получить значение имени пользователя для создания идентификаторов чата. Это моя проблема, чтобы получить значения внутри ключей. То, что я делаю, похоже, не работает.

Это моя база данных

введите здесь описание изображения

Мне нужно взять значение, данное «имени».

это мой код

package br.sosqueen.com.sosqueen;

import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;

import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.Iterator;

public class UserMessageListFragment extends Fragment {

    private ProgressDialog progressDialog;
    private final String TAG = "UsersMessageLis";
    private ArrayList<String> arrayList = new ArrayList<>();
    private int totalUsers = 0;
    private ListView usersList;
    private TextView noUsersText;

    public static UserMessageListFragment newInstance() {
        return new UserMessageListFragment();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_user_message_list, container, false);

        usersList = view.findViewById(R.id.usersList);
        noUsersText = view.findViewById(R.id.noUsersText);

        progressDialog = new ProgressDialog(getContext());
        progressDialog.setMessage("Carregando...");
        progressDialog.show();

        //String url = "https://sosqueen-6b80b.firebaseio.com/users.json";
        String url = "https://sosqueen-6b80b.firebaseio.com/usuarios.json";
        StringRequest request = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                doOnSuccess(response);
            }
        }, new Response.ErrorListener(){
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.d(TAG, "Error on trying to do request");
            }
        });

        RequestQueue rQueue = Volley.newRequestQueue(getContext());
        rQueue.add(request);

        usersList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                UserDetails.chatWith = arrayList.get(position);
                startActivity(new Intent(getContext(), Chat.class));
            }
        });

        return view;
    }

    public void doOnSuccess(String response) {

        try {
            JSONObject object = new JSONObject(response);
            Iterator iterator = object.keys();
            String key = "";

            while(iterator.hasNext()) {
                key = iterator.next().toString();

                if(! key.equals(UserDetails.username)) {
                    arrayList.add(key);
                }
                totalUsers++;
            }

        } catch (JSONException e) {
            e.printStackTrace();
        }

        checkIfThereIsAnUser(totalUsers);
    }

    public void checkIfThereIsAnUser(int totalUsers) {


        if(totalUsers <=1){
            noUsersText.setVisibility(View.VISIBLE);
            usersList.setVisibility(View.GONE);
        }
        else{
            noUsersText.setVisibility(View.GONE);
            usersList.setVisibility(View.VISIBLE);
            usersList.setAdapter(new ArrayAdapter<>(getContext(), R.layout.my_list, arrayList));
        }
        progressDialog.dismiss();
    }
}

person Calvin Custódio    schedule 15.05.2018    source источник
comment
Во-первых, используйте Firebase SDK... Не Volley   -  person OneCricketeer    schedule 15.05.2018
comment
Как бы вы предложили???   -  person Calvin Custódio    schedule 15.05.2018
comment
Ваши предыдущие вопросы используют его... Я не уверен, почему вы сейчас переключились на Volley, который ничего не сделает в реальном времени.   -  person OneCricketeer    schedule 15.05.2018
comment
См. документы... И обратите внимание на использование getValue(Post.class). В вашем случае вы можете создать класс пользователя firebase.google.com/ документы/база данных/android/чтение и запись   -  person OneCricketeer    schedule 15.05.2018


Ответы (1)


Вы хотите создать ChildEventListener и прикрепить его в вашу ветку "users".

Когда вы впервые подключаетесь к ветке с помощью ChildEventListener, OnChildAdded будет срабатывать для каждого дочернего элемента, возвращающего моментальный снимок дочерней ветки данных.

Лично я бы сохранил весь результат снимка данных и при его рендеринге в списке отображал snapshot.getValue("name") вместо ключа ветки.

В противном случае вам нужно будет сохранить пару ключа и имени ветви, а затем просмотреть дополнительную информацию о данных с помощью запроса DatabaseRef OnValue.


Кроме того, вы можете создать запрос на основе некоторых значение ветки (с включенным свойством .indexon), например 'ciudad', и фильтрация на основе локальных имен.

person James Poag    schedule 15.05.2018