Search code examples
androidfirebaselistviewadapter

My list view is automatically populating when other users are using my application(Firebase,android)


Im using custom Adapter to populate my list view dynamically.Getting data from firebase realtime database. i dont want application to populate it with users who are using my application.because when everyone is offline listview stays normal. This is whats happening This is how it should be i've tried everything i could. im using myadapter in 3/4 activities

My adapter.java
public class MyAdapter extends ArrayAdapter<String> {
    ArrayList<String> name=new ArrayList<>();
    ArrayList<String> status=new ArrayList<>();
    ArrayList<String> imgs=new ArrayList<>();
    ArrayList<String> key=new ArrayList<>();
    private Context context;
    private int resource;
    private LayoutInflater layoutInflater;

    public MyAdapter(@NonNull Context context, int resource, ArrayList<String> name, ArrayList<String> status, ArrayList<String> imgs,ArrayList<String> key) {
        super(context, resource);
        this.imgs=imgs;
        this.name=name;
        this.status=status;
        this.key=key;
        this.resource=resource;
        this.context=context;
        layoutInflater= (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public int getCount() {
        return name.size();
    }

    @NonNull
    @Override
    public View getView(final int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        //  return super.getView(position, convertView, parent);
        View v=layoutInflater.inflate(resource,parent,false);
        CircleImageView view=v.findViewById(R.id.single_user_image);
        if(imgs!=null) {
            Picasso.get().load(imgs.get(position)).placeholder(R.drawable.user).into(view);
        }else{
            Picasso.get().load(R.drawable.user).into(view);
            Toasty.error(context,"check internet connection", Toast.LENGTH_SHORT).show();
        }
        TextView tv1=v.findViewById(R.id.single_user_name);
        TextView tv2=v.findViewById(R.id.single_user_status);
        tv1.setText(name.get(position));
        tv2.setText("Connected Since:"+status.get(position));
        v.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent(getContext(),SingleUserProfileActivity.class);
                intent.putExtra("key",key.get(position));
                getContext().startActivity(intent);
            }
        });
        return v;
    }
}

Myactivity.java

public class ConnectedUsersFragment extends Fragment {
    ListView connectedUsersList;
    DatabaseReference connectedUsersReference;
    DatabaseReference userInfoRefernce;
    DatabaseReference presenceReference;
    ArrayList<String> name=new ArrayList<>();
    ArrayList<String> status=new ArrayList<>();
    ArrayList<String> imgs=new ArrayList<>();
    ArrayList<String> key=new ArrayList<>();
    MyAdapter adapter;
    FirebaseUser user;


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


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View v= inflater.inflate(R.layout.fragment_connected_users, container, false);
        connectedUsersList=v.findViewById(R.id.connected_users_list);
        user=FirebaseAuth.getInstance().getCurrentUser();
        presenceReference=FirebaseDatabase.getInstance().getReference().child("users").child(user.getUid());
        connectedUsersReference= FirebaseDatabase.getInstance().getReference().child("connected_users").child(user.getUid());
        userInfoRefernce=FirebaseDatabase.getInstance().getReference().child("users");
        adapter=new MyAdapter(getContext(),R.layout.single_user_layout,name,status,imgs,key);
        connectedUsersList.setAdapter(adapter);
        connectedUsersReference.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
                String userKey=dataSnapshot.getKey();
                final String userConnectedDate=dataSnapshot.child("date").getValue(String.class);
                userInfoRefernce.child(userKey).addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                        String userKey=dataSnapshot.getKey();
                        String username=dataSnapshot.child("name").getValue(String.class);
                        String userstatus=dataSnapshot.child("profile_status").getValue(String.class);
                        String userimg=dataSnapshot.child("thumb_image").getValue(String.class);
                        name.add(username);
                        status.add(userConnectedDate);
                        imgs.add(userimg);
                        key.add(userKey);
                        adapter.notifyDataSetChanged();
                    }

                    @Override
                    public void onCancelled(@NonNull DatabaseError databaseError) {
                        Toasty.error(getContext(), databaseError.getMessage(), Toast.LENGTH_SHORT).show();
                    }
                });

            }

            @Override
            public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

            }

            @Override
            public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {

            }

            @Override
            public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                Toasty.warning(getContext(), databaseError.getMessage(), Toast.LENGTH_SHORT).show();
            }
        });
        return v;
    }

    @Override
    public void onStart() {
        super.onStart();
        if(user!=null) {
            presenceReference.child("online").setValue("true");
        }
    }

    @Override
    public void onResume() {
        super.onResume();
        if(user!=null) {
            presenceReference.child("online").setValue("true");
        }
    }

    @Override
    public void onStop() {
        super.onStop();
        if(user!=null) {
            presenceReference.child("online").setValue(ServerValue.TIMESTAMP);
        }
    }

    @Override
    public void onPause() {
        super.onPause();
        if(user!=null) {
            presenceReference.child("online").setValue(ServerValue.TIMESTAMP);
        }
    }
}

Solution

  • I replaced ValueEventListener() to ListenerForSingleValueEvent() as i wanted to show listen for event just once on these pages and thanks to @Victor Maldonado i remembered the difference :P