получение данных не отображается фрагментом в ListView - PullRequest
1 голос
/ 08 марта 2020

Я хочу получить сохраненные контакты из базы данных Firebase в реальном времени. Контакты сохраняются в базе данных реального времени Firebase. Но не получает. Когда пользователь принимает запрос чата, его имя сохраняется в узле контактов в базе данных. Я хочу получить этот сохраненный контакт во фрагменте контакта, но данные не отображаются во фрагменте. Помоги мне, пожалуйста. вот код:

XML

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





    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/contacts_list"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />


</RelativeLayout>

java

import android.os.Bundle;

import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.firebase.ui.database.FirebaseRecyclerAdapter;
import com.firebase.ui.database.FirebaseRecyclerOptions;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import com.squareup.picasso.Picasso;

import de.hdodenhof.circleimageview.CircleImageView;


/**
 * A simple {@link Fragment} subclass.
 */
public class ContactsFragment extends Fragment {
    private View ContactsView;
    private RecyclerView myContactsList;
    private DatabaseReference ContactsRef,UsersRef;
    private FirebaseAuth mAuth;
    private String currentUserID;


    public ContactsFragment() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
       ContactsView= inflater.inflate(R.layout.fragment_contacts, container, false);
       myContactsList=(RecyclerView) ContactsView.findViewById(R.id.contacts_list);
       myContactsList.setLayoutManager(new LinearLayoutManager(getContext()));
        mAuth=FirebaseAuth.getInstance();
        currentUserID=mAuth.getCurrentUser().getUid();
       ContactsRef= FirebaseDatabase.getInstance().getReference().child("Contacts").child(currentUserID);
       UsersRef= FirebaseDatabase.getInstance().getReference().child("Users");

       return ContactsView;
    }

    @Override
    public void onStart() {
        super.onStart();
        FirebaseRecyclerOptions options=new FirebaseRecyclerOptions.Builder<Contacts>()
                .setQuery(ContactsRef,Contacts.class)
                .build();


        FirebaseRecyclerAdapter<Contacts,ContactsViewHolder> adapter=new FirebaseRecyclerAdapter<Contacts, ContactsViewHolder>(options) {
            @Override
            protected void onBindViewHolder(@NonNull final ContactsViewHolder holder, int position, @NonNull Contacts model) {
                String userIDs=getRef(position).getKey();
                UsersRef.child(userIDs).addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                        if (dataSnapshot.hasChild("Image")){
                            String userProfileImage=dataSnapshot.child("Image").getValue().toString();
                            String profileName=dataSnapshot.child("name").getValue().toString();
                            String profileStatus=dataSnapshot.child("status").getValue().toString();

                            holder.userName.setText(profileName);
                            holder.userStatus.setText(profileStatus);
                            Picasso.get().load(userProfileImage).placeholder(R.drawable.profile_image).into(holder.profileImage);

                        }
                        else {
                            String profileName=dataSnapshot.child("name").getValue().toString();
                            String profileStatus=dataSnapshot.child("status").getValue().toString();

                            holder.userName.setText(profileName);
                            holder.userStatus.setText(profileStatus);
                        }

                    }

                    @Override
                    public void onCancelled(@NonNull DatabaseError databaseError) {

                    }
                });


            }

            @NonNull
            @Override
            public ContactsViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
                View view=LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.users_display_layout,viewGroup,false);
                ContactsViewHolder viewHolder=new ContactsViewHolder(view);
                return viewHolder;
            }
        };
    }
    public static class ContactsViewHolder extends RecyclerView.ViewHolder
    {
        TextView userName,userStatus;
        CircleImageView profileImage;
        public ContactsViewHolder(@NonNull View itemView) {
            super(itemView);
            userName=(TextView)itemView.findViewById(R.id.user_profile_name);
            userStatus=(TextView)itemView.findViewById(R.id.user_status);
            profileImage=(CircleImageView) itemView.findViewById(R.id.users_profile_image);
        }
    }
}

1 Ответ

1 голос
/ 08 марта 2020

Вам нужно использовать startListening, чтобы начать заполнять данные:

@Override
protected void onStart() {
    super.onStart();
    adapter.startListening();
}

Из документов:

FirebaseRecyclerPagingAdapter прослушивает события прокрутки и загружает дополнительные страницы из базы данных только при необходимости.

Чтобы начать заполнение данных, вызовите метод startListening (). Вы можете вызвать это в вашем методе onStart (). Убедитесь, что вы завершили любую аутентификацию, необходимую для чтения данных, перед вызовом startListening (), иначе ваш запрос не будет выполнен.

https://github.com/firebase/FirebaseUI-Android/blob/master/database/README.md

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...