首页 > 解决方案 > 检测到 Firebase 数据库更改时,我的活动转到以前的活动

问题描述

那就是包含 recyclerView 的 Fragment,它会导致 Chat 的活动

public class FragmentBusinessHome extends Fragment {
/* For to do adapter */
private List<String> namesToDo;
private List<String> uids;
private List<String> servicesNames;
private AdapterToDo adapterToDo;
private RecyclerView toDoRecyclerView;

/* For checking requests adapter */
private List<String> userUids;
private List<String> serviceNames;
private List<String> userNames;
private AdapterPendingRequests adapterPendingRequests;
private RecyclerView pendingRequestsRecyclerView;

private FirebaseAuth mAuth;

public FragmentBusinessHome(){

}

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

    mAuth = FirebaseAuth.getInstance();

    namesToDo = new ArrayList<>();
    uids = new ArrayList<>();
    servicesNames = new ArrayList<>();

    userUids = new ArrayList<>();
    serviceNames = new ArrayList<>();
    userNames = new ArrayList<>();

    toDoRecyclerView = view.findViewById(R.id.toDoRecyclerView);
    pendingRequestsRecyclerView = view.findViewById(R.id.requestsToApproveRecyclerView);

    LinearLayoutManager layoutManagerActive = new LinearLayoutManager(getActivity());
    layoutManagerActive.setStackFromEnd(true);
    layoutManagerActive.setReverseLayout(true);
    toDoRecyclerView.setLayoutManager(layoutManagerActive);

    LinearLayoutManager layoutManagerPendingRequests = new LinearLayoutManager(getActivity());
    layoutManagerPendingRequests.setStackFromEnd(true);
    layoutManagerPendingRequests.setReverseLayout(true);
    pendingRequestsRecyclerView.setLayoutManager(layoutManagerPendingRequests);


    String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();

    DatabaseReference checkRequests = FirebaseDatabase.getInstance().getReference("Providers").child(uid).child("Gigs");
    checkRequests.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for (DataSnapshot ds : dataSnapshot.getChildren()) {
                if (ds.getValue(String.class).equals("active")) {
                    DatabaseReference getRequests = FirebaseDatabase.getInstance().getReference("Services").child(ds.getKey()).child(uid).child("Gigs").child("pending");
                    getRequests.addValueEventListener(new ValueEventListener() {
                        @Override
                        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                            serviceNames.clear(); userNames.clear(); userUids.clear();
                            for (DataSnapshot data : dataSnapshot.getChildren()) {
                                String userName = data.child("names").getValue(String.class);
                                String serviceName = ds.getKey();
                                String userUid = data.getKey();

                                userNames.add(userName);
                                serviceNames.add(serviceName);
                                userUids.add(userUid);

                                adapterPendingRequests = new AdapterPendingRequests(getActivity(), userUids, userNames, serviceNames, mAuth.getCurrentUser().getUid());
                                adapterPendingRequests.notifyDataSetChanged();
                                pendingRequestsRecyclerView.setAdapter(adapterPendingRequests);
                            }
                        }

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

                        }
                    });
                    DatabaseReference getActive = FirebaseDatabase.getInstance().getReference("Services").child(ds.getKey()).child(uid).child("Gigs").child("active");
                    getActive.addValueEventListener(new ValueEventListener() {
                        @Override
                        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                            userUids.clear(); namesToDo.clear(); servicesNames.clear();
                            for(DataSnapshot datas : dataSnapshot.getChildren()){
                                String userUid = datas.getKey();
                                String userName = datas.child("names").getValue(String.class);
                                String serviceName = ds.getKey();

                                userUids.add(userUid);
                                namesToDo.add(userName);
                                servicesNames.add(serviceName);

                                Log.d("TAG", userUids.toString());

                                adapterToDo = new AdapterToDo(getActivity(), namesToDo, userUids, servicesNames);
                                adapterToDo.notifyDataSetChanged();
                                toDoRecyclerView.setAdapter(adapterToDo);

                                if(!userUids.isEmpty()){
                                    LinearLayout toDoLayout = view.findViewById(R.id.toDoLayout);
                                    toDoLayout.setVisibility(View.VISIBLE);
                                }
                            }
                        }

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

                        }
                    });
                }
            }
        }

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

        }
    });



    return view;
}
}

那是片段的活动

private ImageButton moreBtn, chatsBtn;
private BottomNavigationView bottomNavigationView;
private FirebaseAuth mAuth;
private FirebaseUser mUser;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_business_home);

    getSupportFragmentManager().beginTransaction().replace(R.id.fragmentContainer, new FragmentBusinessHome()).commit();

    mAuth = FirebaseAuth.getInstance();
    mUser = mAuth.getCurrentUser();

    bottomNavigationView = findViewById(R.id.bottomNavigationView);
    bottomNavigationView.setOnNavigationItemSelectedListener(navigationListener);

    moreBtn = findViewById(R.id.moreBtn);
    chatsBtn = findViewById(R.id.chatsBtn);

    moreBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            final PopupMenu popup = new PopupMenu(BusinessHomeActivity.this, moreBtn);
            popup.getMenuInflater().inflate(R.menu.popup_toolbar_more_menu, popup.getMenu());
            popup.show();

            popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                @Override
                public boolean onMenuItemClick(MenuItem item) {
                    switch (item.getItemId()){
                        case R.id.sign_out_btn:
                            mAuth.signOut();
                            new android.os.Handler().postDelayed(
                                    new Runnable() {
                                        public void run() {
                                            Intent to_login_activity = new Intent(BusinessHomeActivity.this, WelcomeActivity.class);
                                            startActivity(to_login_activity);
                                            finish();
                                        }
                                    }, 1000);
                    }

                    return true;
                }
            });
        }
    });

    chatsBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(BusinessHomeActivity.this, "Will be available soon!", Toast.LENGTH_LONG).show();
        }
    });
}
private BottomNavigationView.OnNavigationItemSelectedListener navigationListener = new BottomNavigationView.OnNavigationItemSelectedListener() {
    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
        Fragment selectedFragment = null;

        switch (menuItem.getItemId()){
            case R.id.home:
                selectedFragment = new FragmentBusinessHome();
                break;
            case R.id.inbox:
                selectedFragment = new FragmentInbox();
                break;
            case R.id.profile:
                selectedFragment = new FragmentProfile();
                break;
        }

        getSupportFragmentManager().beginTransaction().replace(R.id.fragmentContainer, selectedFragment).commit();

        return true;
    }
};

那是片段的适配器

public class AdapterToDo extends RecyclerView.Adapter<AdapterToDo.MyHolder> {
Context context;
List<String> namesToDo;
List<String> uids;
List<String> servicesNames;

public AdapterToDo(Context context, List<String> namesToDo, List<String> uids, List<String> servicesNames) {
    this.context = context;
    this.namesToDo = namesToDo;
    this.uids = uids;
    this.servicesNames = servicesNames;
}

@NonNull
@Override
public AdapterToDo.MyHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

    View view = LayoutInflater.from(context).inflate(R.layout.to_do_item, parent, false);

    return new AdapterToDo.MyHolder(view);
}

@Override
public void onBindViewHolder(@NonNull final AdapterToDo.MyHolder holder, final int position) {
    holder.userNames.setText(namesToDo.get(position));
    String currentUid = uids.get(position);
    String currentOppositeName = namesToDo.get(position);

    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent to_chat_activity = new Intent(context, ChatActivity.class);
            to_chat_activity.putExtra("oppositeUid", currentUid);
            to_chat_activity.putExtra("oppositeNames", currentOppositeName);
            to_chat_activity.putExtra("class", getClass().getName());
            context.startActivity(to_chat_activity);
        }
    });
}

@Override
public int getItemCount() {
    return uids.size();
}

class MyHolder extends RecyclerView.ViewHolder {

    private TextView userNames;

    private MyHolder(@NonNull View itemView) {
        super(itemView);

        userNames = itemView.findViewById(R.id.userNames);
    }
}
}

也就是fragment的适配器通向的Activity

private String oppositeUid, oppositeNames, className;
private TextView oppositeNamesTextView;
private Button sendBtn;
private EditText message;
private FirebaseAuth mAuth;
private RecyclerView recyclerView;
private List<ModelChat> modelChatList;
private AdapterChat chatAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_chat);

    mAuth = FirebaseAuth.getInstance();

    Intent intent = getIntent();
    oppositeUid = intent.getStringExtra("oppositeUid");
    oppositeNames = intent.getStringExtra("oppositeNames");
    className = intent.getStringExtra("class");
    Log.d("CLASSNAME", className);

    modelChatList = new ArrayList<>();

    oppositeNamesTextView = findViewById(R.id.oppositeNames);
    sendBtn = findViewById(R.id.sendBtn);
    message = findViewById(R.id.message);

    recyclerView = findViewById(R.id.chatRecyclerView);
    LinearLayoutManager linearLayout = new LinearLayoutManager(this);
    linearLayout.setStackFromEnd(true);
    recyclerView.setLayoutManager(linearLayout);

    oppositeNamesTextView.setText(oppositeNames);

    sendBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            final String mMessage = message.getText().toString().trim();
            if(!TextUtils.isEmpty(mMessage)){
                HashMap<Object, String> hashMap = new HashMap<>();
                hashMap.put("sender", mAuth.getCurrentUser().getUid());
                hashMap.put("receiver", oppositeUid);
                hashMap.put("message", mMessage);
                hashMap.put("timestamp", String.valueOf(System.currentTimeMillis()));

                if(className.equals("com.example.uploy.AdapterToDo$1")){
                    DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("Providers").child(mAuth.getCurrentUser().getUid()).child("Chats").child(oppositeUid);
                    databaseReference.push().setValue(hashMap).addOnSuccessListener(new OnSuccessListener<Void>() {
                        @Override
                        public void onSuccess(Void aVoid) {
                            message.setText("");
                        }
                    }).addOnFailureListener(new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {
                            Toast.makeText(ChatActivity.this, "An error occurred!", Toast.LENGTH_SHORT).show();
                        }
                    });

                    DatabaseReference databaseReference1 = FirebaseDatabase.getInstance().getReference("Users").child(oppositeUid).child("Chats").child(mAuth.getCurrentUser().getUid());
                    databaseReference1.push().setValue(hashMap).addOnSuccessListener(new OnSuccessListener<Void>() {
                        @Override
                        public void onSuccess(Void aVoid) {
                            message.setText("");
                        }
                    }).addOnFailureListener(new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {
                            Toast.makeText(ChatActivity.this, "An error occurred!", Toast.LENGTH_SHORT).show();
                        }
                    });
                }else{
                    DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("Providers").child(oppositeUid).child("Chats").child(mAuth.getCurrentUser().getUid());
                    databaseReference.push().setValue(hashMap).addOnSuccessListener(new OnSuccessListener<Void>() {
                        @Override
                        public void onSuccess(Void aVoid) {
                            message.setText("");
                        }
                    }).addOnFailureListener(new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {
                            Toast.makeText(ChatActivity.this, "An error occurred!", Toast.LENGTH_SHORT).show();
                        }
                    });

                    DatabaseReference databaseReference1 = FirebaseDatabase.getInstance().getReference("Users").child(mAuth.getCurrentUser().getUid()).child("Chats").child(oppositeUid);
                    databaseReference1.push().setValue(hashMap).addOnSuccessListener(new OnSuccessListener<Void>() {
                        @Override
                        public void onSuccess(Void aVoid) {
                            message.setText("");
                        }
                    }).addOnFailureListener(new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {
                            Toast.makeText(ChatActivity.this, "An error occurred!", Toast.LENGTH_SHORT).show();
                        }
                    });
                }
            }
        }
    });

    if(className.equals("com.example.uploy.AdapterToDo$1")){
        DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("Providers").child(mAuth.getCurrentUser().getUid()).child("Chats").child(oppositeUid);
        databaseReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                modelChatList.clear();
                for(DataSnapshot snapshot : dataSnapshot.getChildren()){
                    if(snapshot.getKey().equals("details")){
                        continue;
                    }
                    ModelChat modelChat = snapshot.getValue(ModelChat.class);
                    modelChatList.add(modelChat);
                    chatAdapter = new AdapterChat(ChatActivity.this, modelChatList);
                    chatAdapter.notifyDataSetChanged();
                    recyclerView.setAdapter(chatAdapter);
                }
            }

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

            }
        });
    }else{
        DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("Users").child(mAuth.getCurrentUser().getUid()).child("Chats").child(oppositeUid);
        databaseReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                modelChatList.clear();
                for(DataSnapshot snapshot : dataSnapshot.getChildren()){
                    if(snapshot.getKey().equals("details")){
                        continue;
                    }
                    ModelChat modelChat = snapshot.getValue(ModelChat.class);
                    modelChatList.add(modelChat);
                    chatAdapter = new AdapterChat(ChatActivity.this, modelChatList);
                    chatAdapter.notifyDataSetChanged();
                    recyclerView.setAdapter(chatAdapter);
                }
            }

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

            }
        });
    }
}

@Override
public void onBackPressed() {
    super.onBackPressed();
    Log.d("TAG", "PRESSED");
}

问题是,当片段打开活动(它包含与用户之间的聊天消息,加载得很好)并且活动检测到聊天数据库引用中的任何更改时,它会停止并加载前一个活动(放置片段的位置)。我想知道解决方案是什么,如果你能帮助我,我会很高兴。

标签: javaandroiddatabasefirebasefragment

解决方案


推荐阅读