Мой список просмотра автоматически заполняется, когда другие пользователи используют мое приложение (Firebase, Android) - PullRequest
0 голосов
/ 10 июля 2019

Я использую пользовательский адаптер для динамического заполнения списка. Получение данных из базы данных Firebase в реальном времени. я не хочу, чтобы приложение заполняло его пользователями, которые используют мое приложение. потому что, когда все находятся в автономном режиме, просмотр списка остается нормальным. Это то, что происходит Так и должно быть Я перепробовал все, что мог. Я использую myadapter в 3/4 деятельности

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);
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 10 июля 2019

Я заменил ValueEventListener () на ListenerForSingleValueEvent (), так как я хотел показать прослушивание события только один раз на этих страницах, и благодаря @Victor Maldonado я вспомнил разницу: P

0 голосов
/ 10 июля 2019

В userInfoRefernce.child(userKey) вы устанавливаете ValueEventListener, который запускается каждый раз, когда пользователь запускает какое-либо событие жизненного цикла (см. OnStart, onResume, onPause и onStop).Попробуйте использовать ChildEventListener и Запрос для фильтрации ваших данных перед загрузкой.

Надеюсь, это вам поможет.

...