0

Code

public class HomeScreen_Friends extends Fragment {

    private View rootView;
    private String userName;
    private String UID;
    private TextView noUsersText;
    private ProgressDialog mProgressDialogue;

    private FirebaseAuth mAuth;
    private FirebaseUser currentUser;
    private  DatabaseReference mDatabaseReference;
    private  DatabaseReference mUsersDatabase;

    private RecyclerView mUsersList;
    private FirebaseRecyclerAdapter<AllUsersHelper, UsersViewHolder> firebaseRecyclerAdapter;

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

        noUsersText = (TextView) rootView.findViewById(R.id.noUsersText);
        mUsersList = (RecyclerView) rootView.findViewById(R.id.usersList);
        mUsersList.addItemDecoration(new DividerItemDecoration(getContext(),
                DividerItemDecoration.HORIZONTAL));


        mAuth = FirebaseAuth.getInstance();
        currentUser = mAuth.getCurrentUser();
        UID = mAuth.getCurrentUser().getUid();
        mDatabaseReference = FirebaseDatabase.getInstance().getReference().child("Friends").child(UID);
        mDatabaseReference.keepSynced(true);
        mUsersDatabase = FirebaseDatabase.getInstance().getReference().child("UserData");
        mUsersDatabase.keepSynced(true);

        mProgressDialogue = new ProgressDialog(getActivity());
        mProgressDialogue.setMessage("Loading...");
        mProgressDialogue.show();

        mUsersList.setLayoutManager(new LinearLayoutManager(getActivity()));

        FirebaseRecyclerOptions<AllUsersHelper> options =
                new FirebaseRecyclerOptions.Builder<AllUsersHelper>()
                        .setQuery(mDatabaseReference, AllUsersHelper.class)
                        .build();

        firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<AllUsersHelper, UsersViewHolder>(options) {

            @Override
            protected void onBindViewHolder(@NonNull final UsersViewHolder holder, int position, @NonNull AllUsersHelper model) {
                holder.setName(model.getName());
                holder.setStatus(model.getStatus());
                holder.setImage(model.getImage());

                final String userId = getRef(position).getKey();

                mUsersDatabase.orderByChild("Name");
                mUsersDatabase.child(userId).addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {

                        String mName = dataSnapshot.child("Name").getValue().toString();
                        String mStatus = dataSnapshot.child("Status").getValue().toString();
                        String mDisplayImage = dataSnapshot.child("Image").getValue().toString();

                        if(dataSnapshot.hasChild("Online")) {

                            String userOnline = dataSnapshot.child("Online").getValue().toString();
                            holder.setUserOnline(userOnline);

                        }
                        holder.setName(mName);
                        holder.setImage(mDisplayImage);
                        holder.setStatus(mStatus);
                        mProgressDialogue.dismiss();

                    }
                    @Override
                    public void onCancelled(DatabaseError databaseError) {

                    }
                });



                holder.mView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {

                        DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference().child("UserData").child(userId);

                        rootRef.addListenerForSingleValueEvent(new ValueEventListener() {
                            @Override
                            public void onDataChange(DataSnapshot dataSnapshot) {
                                userName = dataSnapshot.child("Name").getValue().toString();
                                Intent intent = new Intent(getActivity(), Chat.class);
                                intent.putExtra("Recievers_Id", userId);
                                intent.putExtra("Recievers_Name", userName);
                                startActivity(intent);
                            }
                            @Override
                            public void onCancelled(DatabaseError databaseError) {
                            }
                        });
                    }
                });
            }




                    @Override
            public UsersViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
                View view = LayoutInflater.from(parent.getContext())
                        .inflate(R.layout.custom_activity_all_users, parent, false);
                return new UsersViewHolder(view);
            }
        };
        mUsersList.setAdapter(firebaseRecyclerAdapter);
        return rootView;
    }

    public static class UsersViewHolder extends RecyclerView.ViewHolder {
    public View mView;

    public UsersViewHolder(View itemView) {
        super(itemView);
        mView = itemView;
    }

    public void setName(String name) {
        TextView mDisplayName = (TextView) mView.findViewById(R.id.display_name);
        mDisplayName.setText(name);
    }

    public void setStatus(String status) {
        TextView mDisplayStatus = (TextView) mView.findViewById(R.id.display_status);
        mDisplayStatus.setText(status);
    }

    public void setImage(String image) {
        CircularImageView mDisplayImage = (CircularImageView) mView.findViewById(R.id.circleImageView);
        Picasso.get().load(image).into(mDisplayImage);
    }

    public void setUserOnline(String userOnline) {
        ImageView userOnlineView = (ImageView) mView.findViewById(R.id.online);

        if(userOnline.equals("Online")){

            userOnlineView.setVisibility(View.VISIBLE);

        } else {

            userOnlineView.setVisibility(View.INVISIBLE);

        }

    }
    }

    @Override
    public void onStart() {
        super.onStart();
        firebaseRecyclerAdapter.startListening();
    }
    @Override
    public void onStop() {
        super.onStop();
        if(firebaseRecyclerAdapter != null) {
            firebaseRecyclerAdapter.stopListening();
        }
    }

}

Where should i put the keepSynced method for retrieving data offline because i tried below the database reference and it still doesn't show my data when i have no internet. Can someone help me out please... Also if the resukt is null how can i stop the progress dialog and show a text which says there are no users.

Frank van Puffelen
  • 565,676
  • 79
  • 828
  • 807
  • Has the device ever had an internet connection? That is necessary for the database client to read the data and populate the cache. Only after that can it work while offline. – Frank van Puffelen Oct 24 '18 at 12:58
  • To hide the progress dialog, see https://stackoverflow.com/questions/40201574/how-to-dismiss-a-progress-bar-even-if-there-is-no-view-to-populate-in-the-fireba – Frank van Puffelen Oct 24 '18 at 12:58
  • Yeah i make sure that first time it loads with internet and then i switch it off... but it doesn't load then @FrankvanPuffelen –  Oct 24 '18 at 14:25
  • Ah, you never enable disk persistence. For that you need to call `FirebaseDatabase.getInstance().setPersistenceEnabled(true);`. See https://firebase.google.com/docs/database/android/offline-capabilities#section-disk-persistence – Frank van Puffelen Oct 24 '18 at 15:26

1 Answers1

1

Right now you're just telling Firebase to keep an empty listener active on your Friends and UserData nodes. This ensures that the data from these nodes is always kept up to date (even when you don't attach any other listeners), but the data is still only kept in memory.

To persist the memory cache to disk, so that it can be reloaded in case you don't have an internet connection when starting the app, you'll need to call FirebaseDatabase.getInstance().setPersistenceEnabled(true) when the app starts. See enabling disk persistence in the Firebase docs.

Also see:

Frank van Puffelen
  • 565,676
  • 79
  • 828
  • 807