База данных Firebase Пользователи не отображаются в моем списке? - PullRequest
0 голосов
/ 23 марта 2020

Я пытался выяснить, почему это не работает, и я посмотрел на другие сообщения stackoverflow, но я не могу понять, как это правильно.

Вот мой код, это фрагмент, который должен отображать пользователей из моей базы данных Firebase в реальном времени.

public class PeopleFragment extends Fragment {

ListView listView;
private List<User> mUsers;
private TextInputEditText search_bar;

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_people, container, false);

    //construct the data source
  ArrayList<User> arrayOfUsers = new ArrayList<User>();

  //create the adapter to convert the array into view

    UserAdapter adapter = new UserAdapter(getContext(), arrayOfUsers);

    listView = view.findViewById(R.id.list_view2);
    listView.setAdapter(adapter);

    search_bar = view.findViewById(R.id.search_bar);
    mUsers = new ArrayList<>();
    readUsers();



    return view;
}


//Used to read the users from the database

public void readUsers() {
    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    DatabaseReference usersdRef = rootRef.child("Users");
    ValueEventListener eventListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            List<String> list = new ArrayList<>();
            for (DataSnapshot ds : dataSnapshot.getChildren()) {
                String name = ds.child("Name").getValue(String.class);
                list.add(name);
                Log.d("TAG", name);
            }
            //Out of the loop
            ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(getActivity(), R.layout.user_item, list);
            listView.setAdapter(arrayAdapter);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
        }
    };

}

}

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

public class UserAdapter extends ArrayAdapter<User> {

public UserAdapter(Context context, ArrayList<User> users) {
    super(context, 0, users);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    //get the data item for this position
    User user = getItem(position);

    //check if an existing view is being reused, otherwise inflate

    if(convertView == null) {
        convertView = LayoutInflater.from(getContext()).inflate(R.layout.user_item, parent,false);

    }

    TextView name = convertView.findViewById(R.id.username);
    TextView hometown = convertView.findViewById(R.id.hometown);
    name.setText(user.getUsername());
    hometown.setText(user.getCountry());

    return convertView;

}

}

Вот мой XML файл:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
xmlns:tools="http://schemas.android.com/tools"
android:layout_height="match_parent"
android:background="@color/colorPrimary"
tools:context=".Fragments.PeopleFragment">



<ListView
    android:id="@+id/list_view2"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

</RelativeLayout>

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

Вот моя структура базы данных в виде JSON

{
"Users" : {
  "DScz6jMT32VyhwUuaOb5B8tqLVs1" : {
    "Age" : "22",
    "Country" : "Bahrain",
    "Name" : "tomas"
  },

   "hrDq5RR4PXNKXGSv5KJJabZRbqA2" : {
   "Age" : "17",
   "Country" : "Portugal",
   "Name" : "Tomás Mota",
    "Posts" : {
      "-Lw_6ZSyVScYbiktPQh8" : {
        "Post" : "GOOD"
    },

      "-Lw_MlgUn01UPCqAgzdc" : {
       "Post" : "Very well actually"
     }
   }
 }
}

}

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 23 марта 2020

В вашем коде есть две основные проблемы. Во-первых, вы используете неправильную ссылку. Поэтому, пожалуйста, измените следующую строку кода:

DatabaseReference usersdRef = rootRef.child("users");

На:

DatabaseReference usersdRef = rootRef.child("Users");

Это Users и не users, см. Заглавную букву U? Это просто небольшая опечатка, но вторая проблема заключается в том, что вы устанавливаете адаптер на каждую итерацию for-l oop. Чтобы решить их, получите эти две строки кода из l oop, как в следующих строках кода:

ValueEventListener eventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        List<String> list = new ArrayList<>();
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String name = ds.child("Name").getValue(String.class);
            list.add(name);
            Log.d("TAG", name);
        }
        //Out of the loop
        ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(getActivity(), R.layout.user_item, list);
        listView.setAdapter(arrayAdapter);
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...