Давным-давно, но у меня есть приложение для чата / чата, которое использует fragments
. Внутри chat fragment
находится recyclerview
, который получает данные от Firebase Database
. Когда вы нажимаете на чаты внутри fragment
, вы попадете в Chat Activity
. Все работает так, как должно, за исключением одной проблемы. У меня были проблемы с получением последнего сообщения. Когда пользователи отправляют сообщения, в database
создается push id
. Сначала я пытался получить последний push-идентификатор и получить сообщение, но столкнулся с проблемами с моим recyclerview
, который просто переполнил бы и добавил элементы к существующему recyclerview
.
Итак, я создал child
с именем lastMessage
, который меняется каждый раз при отправке нового сообщения. Мой recyclerview
получает value
от этого child
без каких-либо проблем, за исключением того, что он получит это значение только при открытии приложения. Я хочу, чтобы recyclerview
, fragment
или метод внутри fragment
просто обновлялись, когда я включал backpress
в Chat Activity
, и возвращались в Chat Fragment
. Я пробовал разные их варианты, но все они заканчиваются сбоем:
Попробовал это:
FragmentManager fm = getSupportFragmentManager();
YourFragmentClass fragment =
(YourFragmentClass)fm.findFragmentById(R.id.your_fragment_id);
fragment.method();
А это
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
// Refresh your fragment here
}
}
И многие другие, но не могут заставить его работать. Кто-нибудь может мне с этим помочь? Я попытался вызвать метод в моем Chat Activity
, но он также завершается сбоем. Я просто хочу, чтобы мои method
или fragment
обновлялись так же, как если бы я закрывал приложение и загружал его обратно, но когда вместо этого backpress
в моем Chat Activity
. Мой код ниже:
Основная деятельность
public class MainFragmentActivity extends AppCompatActivity {
private SectionsPageAdapter mSectionsPageAdapter;
private ViewPager mViewPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_fragment);
mSectionsPageAdapter = new SectionsPageAdapter(getSupportFragmentManager());
//Setup the Viewpager with sections adapter
mViewPager = (ViewPager) findViewById(R.id.container);
mViewPager.setOffscreenPageLimit(5);
setupViewPager(mViewPager);
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setupWithViewPager(mViewPager);
}
private void setupViewPager(ViewPager viewPager){
SectionsPageAdapter adapter = new SectionsPageAdapter(getSupportFragmentManager());
adapter.addFragment(new Fragment_Account(), "Account");
adapter.addFragment(new Fragment_Swipes(), "Matches");
adapter.addFragment(new Fragment_MatchChats(), "Chat");
viewPager.setAdapter(adapter);
}
Фрагмент чата
public class Fragment_MatchChats extends Fragment {
private RecyclerView mRecyclerView, mRecyclerViewChat;
private RecyclerView.Adapter mMatchesAdapter, mChatAdapter;
private String currentUserID;
private DatabaseReference mDatabaseChat;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.frag_match_chat, container, false);
currentUserID = FirebaseAuth.getInstance().getCurrentUser().getUid();
mDatabaseChat = FirebaseDatabase.getInstance().getReference().child("Chat");
LinearLayoutManager layoutManager = new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, false);
LinearLayoutManager layoutManagerChat = new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false);
mRecyclerView = (RecyclerView) v.findViewById(R.id.recyclerView);
mRecyclerViewChat = (RecyclerView) v.findViewById(R.id.recyclerViewChat);
mRecyclerView.setHasFixedSize(true);
mRecyclerView.setLayoutManager(layoutManager);
mRecyclerViewChat.setHasFixedSize(true);
mRecyclerViewChat.setLayoutManager(layoutManagerChat);
mMatchesAdapter = new MatchesAdapter(getDataSetMatches(), getContext());
mChatAdapter = new RecyclerViewChatAdapter(getmDataSetChat(), getContext());
//This is the method I would like to refresh but it will crash because of parameters issues
getUserMatchId();
return v;
}
//this method will get the user ID in the database that you matched with. It will run through the matches child and get all the user IDs
private void getUserMatchId() {
DatabaseReference matchDB = FirebaseDatabase.getInstance().getReference().child("Users").child(currentUserID).child("swipes").child("matches");
matchDB.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()){
for(DataSnapshot match : dataSnapshot.getChildren()){
CheckChatID(match.getKey());
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
private void CheckChatID(final String chat) {
DatabaseReference ChatDB = FirebaseDatabase.getInstance().getReference().child("Users").child(currentUserID).child("swipes").child("matches")
.child(chat).child("ChatID");
ChatDB.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()){
String ChatID = dataSnapshot.getValue().toString();
ChatIDExist(ChatID, chat);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
private void ChatIDExist(final String chatID, final String oppUserID) {
final DatabaseReference ChatDB = mDatabaseChat.child(chatID);
ChatDB.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(dataSnapshot.exists()){
getLastChatMessages(oppUserID, chatID);
} else {
FetchMatchInfo(oppUserID);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
private void getLastChatMessages(final String oppUser, String chatID) {
final DatabaseReference LastChatDB = mDatabaseChat.child(chatID).child("lastMessage");
LastChatDB.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(dataSnapshot.exists()){
String lastText = "";
if (dataSnapshot.child("text").getValue() != null){
lastText = dataSnapshot.child("text").getValue().toString();
FetchChatInfo(oppUser,lastText);
}
} else{
FetchChatInfo(oppUser,"");
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
private void FetchChatInfo(String key, final String lastText) {
DatabaseReference userDB = FirebaseDatabase.getInstance().getReference().child("Users").child(key);
userDB.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(dataSnapshot.exists()){
String matched_userID = dataSnapshot.getKey();
String matches_userName = "";
String matches_userProPic = "";
String match_lastText = lastText;
if(dataSnapshot.child("name").getValue() != null){
matches_userName = dataSnapshot.child("name").getValue().toString();
}
if(dataSnapshot.child("profilePicURL").getValue() != null){
matches_userProPic = dataSnapshot.child("profilePicURL").getValue().toString();
}
RecyclerViewChatReference chat_obj = new RecyclerViewChatReference(matched_userID, matches_userName, matches_userProPic, match_lastText);
mresultsChats.add(chat_obj);
mRecyclerViewChat.setAdapter(mChatAdapter);
mChatAdapter.notifyDataSetChanged();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
private ArrayList<MatchesReference> resultsMatches = new ArrayList<MatchesReference>();
public ArrayList<RecyclerViewChatReference> mresultsChats = new ArrayList<RecyclerViewChatReference>();
private List<MatchesReference> getDataSetMatches() {
return resultsMatches;
}
private List<RecyclerViewChatReference> getmDataSetChat() {
return mresultsChats;
}
}
Активность в чате
public class ChatActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_chat);
matchId = getIntent().getExtras().getString("matchID");
currentUserID = FirebaseAuth.getInstance().getCurrentUser().getUid();
getChatId();
mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
mRecyclerView.setNestedScrollingEnabled(false);
mRecyclerView.setHasFixedSize(false);
mChatLayoutManager = new LinearLayoutManager(ChatActivity.this);
mRecyclerView.setLayoutManager(mChatLayoutManager);
mChatAdapter = new ChatAdapter(getDataSetChat(), ChatActivity.this);
mRecyclerView.setAdapter(mChatAdapter);
mSendEditText = findViewById(R.id.message);
mSendButton = findViewById(R.id.send);
mSendButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
sendMessage();
}
});
}
private void sendMessage() {
String sendMessageText = mSendEditText.getText().toString();
if(!sendMessageText.isEmpty()){
DatabaseReference newMessageDb = mDatabaseChat.push();
DatabaseReference lastMessage = mDatabaseChat.child("lastMessage");
Map newMessage = new HashMap();
newMessage.put("createdByUser", currentUserID);
newMessage.put("text", sendMessageText);
Map mLastMessage = new HashMap();
mLastMessage.put("createdByUser", currentUserID);
mLastMessage.put("text", sendMessageText);
newMessageDb.setValue(newMessage);
lastMessage.setValue(mLastMessage);
}
mSendEditText.setText(null);
}
private void getChatId(){
mDatabaseUser.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()){
chatId = dataSnapshot.getValue().toString();
mDatabaseChat = mDatabaseChat.child(chatId);
getChatMessages();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}