Fragmento no se actualizará después de la notificación de apertura

Estoy construyendo una aplicación de chat y tengo una pregunta sobre mi fragmento que contiene un listview con todos los chats.

Cuando un usuario recibe un mensaje, la lista de chats se actualiza (mostrando el último mensaje para cada chat) ( imagen 1 ).

Cuando un chat no está visible y se recibe un mensaje en ese chat, el usuario recibirá una notificación ( imagen 2 )

En este punto el problema comienza. Cuando el usuario hace clic en la notificación, la vista de lista de chats parece estar rota. Cuando el usuario recibe otro mensaje después de hacer clic en la notificación, su teléfono vibrará pero la lista de chats no cambiará / actualizará.

Las otras vistas funcionan después de hacer clic en la notificación.

A continuación se muestra un fragmento del código que maneja la actualización de listview.

protected PacketListener packetListener = new PacketListener() { @Override public void processPacket(Packet packet) { final Message message = (Message) packet; if (message.getBody() != null) { final String fromName = StringUtils.parseName(message.getFrom()); runOnUiThread(new Runnable(){ @Override public void run() { Boolean seen = false; if(ChatFragment.currentChat != null && ChatFragment.currentChat.getContact().getUsername().equals(fromName) && VisibilityHelper.appIsVisible() && VisibilityHelper.fragmentIsVisible(ChatFragment.fragmentClassName)) { seen = true; } Long chat_id = chatsDataSource.getChatByContactId(contactsDataSource.getContactByUsername(fromName).getId()).getId(); ChatMessage newChatMessage = chatMessagesDataSource.insertChatMessage(chat_id, ConstantHelper.CHAT_MESSAGES_TYPE_RECEIVED, seen, DateHelper.getDatetime(), message.getBody()); Log.d("DEBUG", VisibilityHelper.sCurrentFragmentClassName); if(VisibilityHelper.appIsVisible() && VisibilityHelper.fragmentIsVisible(ChatsFragment.fragmentClassName)) { ChatsFragment chatsFragment = (ChatsFragment) getFragmentManager().findFragmentByTag(ChatsFragment.fragmentClassName); Log.d("DEBUG", "REFRESHING"); chatsFragment.refreshChatsList(); } if(!VisibilityHelper.appIsVisible()) { notificationHelper.externalNotification(getBaseContext(), newChatMessage); } else { if(ChatFragment.currentChat != null && ChatFragment.currentChat.getContact().getUsername().equals(fromName) && VisibilityHelper.appIsVisible() && VisibilityHelper.fragmentIsVisible(ChatFragment.fragmentClassName)) { ChatFragment.chatsList.add(newChatMessage); ChatFragment.chatsList.notifyDataSetChanged(); } else { notificationHelper.internalNotification(getBaseContext(), newChatMessage); } } } }); } } }; 

Actividad principal (cómo se crean los fragmentos)

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().requestFeature(Window.FEATURE_INDETERMINATE_PROGRESS); setContentView(R.layout.activity_main); Bundle extras = getIntent().getExtras(); initializeDataSources(); setLastContactUpdate(); if(usersDataSource.getCurrentUser() == null) { Intent LoginActivity = new Intent(getApplicationContext(), LoginActivity.class); LoginActivity.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(LoginActivity); finish(); } else { if(localServiceBinder == null) localServiceBinder = new LocalServiceBinder(); bindLocalService(); runDispatchMethod(extras, savedInstanceState); if (savedInstanceState == null) { getAndSaveUserDetails(); GCMRegistrationID = registerGCM(); } } } protected void runDispatchMethod(Bundle extras, Bundle savedInstanceState) { if(savedInstanceState == null) { startFragment(new ChatsFragment(), false); } if(extras != null && extras.getString(ConstantHelper.RECEIVED_MESSAGES_FROM) != null && !extras.getString(ConstantHelper.RECEIVED_MESSAGES_FROM).equals("")) { getFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); startFragment(new ChatsFragment(), false); ChatFragment chatFragment = new ChatFragment(); Bundle chatExtras = (Bundle) new Bundle(); chatExtras.putString(ConstantHelper.RECEIVED_MESSAGES_FROM, extras.getString(ConstantHelper.RECEIVED_MESSAGES_FROM)); chatFragment.setArguments(chatExtras); startFragment(chatFragment); return; } } public void startFragment(Fragment newFragment) { startFragment(newFragment, true); } public void startFragment(Fragment newFragment, Boolean addToBackstack) { if(addToBackstack) { getFragmentManager().beginTransaction().replace(R.id.container, newFragment, newFragment.getClass().getName()).addToBackStack(newFragment.getClass().getName()).commit(); } else { getFragmentManager().beginTransaction().replace(R.id.container, newFragment, newFragment.getClass().getName()).commit(); } getFragmentManager().executePendingTransactions(); } 

Adaptador de chats

 public class ChatsAdapter extends BaseAdapter { private List<Chat> chats; private LayoutInflater inflater; private String emptyLastMessageValue; public ChatsAdapter(Context context, List<Chat> chats) { this.chats = chats; this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); emptyLastMessageValue = context.getText(R.string.fragment_chats_chat_created).toString(); } @Override public int getCount() { return chats.size(); } @Override public Chat getItem(int position) { return chats.get(position); } @Override public long getItemId(int position) { return chats.get(position).getId(); } @Override public View getView(int position, View convertView, ViewGroup parent) { View chatAdapterView = convertView; if(convertView == null) chatAdapterView = inflater.inflate(R.layout.adapter_chats, null); TextView layout_fullname = (TextView) chatAdapterView.findViewById(R.id.fullname); TextView layout_last_message = (TextView) chatAdapterView.findViewById(R.id.last_message); TextView layout_unread_messages = (TextView) chatAdapterView.findViewById(R.id.unread_messages); TextView layout_last_message_datetime = (TextView) chatAdapterView.findViewById(R.id.last_message_datetime); Chat row = chats.get(position); String firstname = row.getContact().getFirstname(); String fullname = row.getContact().getFullname(); if(firstname == null || firstname.equals("")) fullname = StringHelper.ucfirst(row.getContact().getUsername()); layout_fullname.setText(fullname); String last_message_value; String last_message_datetime_value = ""; if(row.getLastMessage() == null) { last_message_value = emptyLastMessageValue; layout_last_message_datetime.setVisibility(TextView.GONE); layout_unread_messages.setVisibility(TextView.GONE); } else { last_message_value = row.getLastMessage().getMessageBody(); last_message_datetime_value = DateHelper.toReadableDatetime(row.getLastMessage().getMessageDatetime()); layout_last_message_datetime.setText(last_message_datetime_value); Integer unreadMessages = row.getUnreadMessages(); if(unreadMessages > 0) { layout_unread_messages.setText(String.valueOf(unreadMessages)); layout_unread_messages.setVisibility(TextView.VISIBLE); } else { layout_unread_messages.setVisibility(TextView.GONE); } } layout_last_message.setText(last_message_value); return chatAdapterView; } } 

Actualizar la función Lista de chats

 public void refreshChatsList() { Log.d("DEBUG", "It does come here!"); chats.clear(); chats.addAll(((MainActivity) getActivity()).chatsDataSource.getAllChats()); chats_adapter.notifyDataSetChanged(); } 

Salida Logcat

 07-06 20:12:43.892: D/SMACK(14948): 08:12:43 PM RCV (1106735848): <message id="3jRRg-24" to="[email protected]" type="chat" from="[email protected]/Smack"><body>Test</body></message> 07-06 20:12:43.962: D/DEBUG(14948): nl.test.messatch.fragments.ChatsFragment 07-06 20:12:43.962: D/DEBUG(14948): REFRESHING 07-06 20:12:43.962: D/DEBUG(14948): It does come here! 07-06 20:12:48.406: D/SMACK(14948): 08:12:48 PM RCV (1106735848): <message id="3jRRg-25" to="[email protected]" type="chat" from="[email protected]/Smack"><body>Test 2</body></message> 07-06 20:12:48.446: D/DEBUG(14948): nl.test.messatch.fragments.ChatsFragment 07-06 20:12:51.059: D/KUTZOOI(14948): HELEMAAL WÄCK 07-06 20:12:51.099: D/dalvikvm(14948): GC_FOR_ALLOC freed 161K, 3% free 9653K/9912K, paused 19ms, total 21ms 07-06 20:12:51.109: I/dalvikvm-heap(14948): Grow heap (frag case) to 13.272MB for 4000016-byte allocation 07-06 20:12:51.139: D/dalvikvm(14948): GC_FOR_ALLOC freed 1K, 2% free 13558K/13820K, paused 25ms, total 25ms 07-06 20:12:54.953: D/SMACK(14948): 08:12:54 PM RCV (1106735848): <message id="3jRRg-26" to="[email protected]" type="chat" from="[email protected]/Smack"><body>Test 3</body></message> 07-06 20:12:54.993: D/DEBUG(14948): nl.test.messatch.fragments.ChatsFragment 07-06 20:12:54.993: D/DEBUG(14948): REFRESHING 07-06 20:12:54.993: D/DEBUG(14948): It does come here! 

Lista de chats Chats listview

Notificación Notificación de chat

Asegúrese de que está trabajando con el mismo fragmento después de volver a la actividad haciendo clic en una notificación (a juzgar por la forma en que aparece el problema). Si no tiene una referencia a la misma instancia que el usuario ve, entonces cualquier actualización de chat fallará silenciosamente, ya que solo actualizará el fragmento de fondo (y no el visible). El error parece estar en el runDispatchMethod() donde se realiza una transacción con un nuevo fragmento cada vez que no se comprueba si ya está disponible otra instancia del ChatsFragment (en cuyo caso se acaba de llamar a un método de actualización en esa instancia).

(Me gustaría poner un comentario si pudiera)

Creo que el problema es el notificationyingdatasetChanged ();

Agregue esto a su adaptador

 public void swapItems(List<Chat> chat) { this.chats = chat; notifyDataSetChanged(); } 

Llame a este para obtener nuevos mensajes

 chats_adapter.swapItems(((MainActivity) getActivity()).chatsDataSource.getAllChats()); 
  • Obtener coordenadas táctiles no es preciso en ImageView FloodFill Algorithm
  • Indicador de actualización de Android SwipeRefreshLayout no visible
  • ¿Es posible registrar un receptor en un caso de prueba?
  • Ejecutar un jar ejecutable en android
  • ¿Debería evitarse también el finalizador de Java para la gestión del ciclo de vida de los objetos nativos?
  • Error al generar el archivo final: el certificado de depuración expiró el
  • ¿Cómo administrar un DialogFragment con RxJava?
  • FragmentTabHost Scrollview Horizontal + Paseo Android
  • El cuadro de diálogo Progreso muestra pero no muestra la barra de progreso y el mensaje no se actualiza
  • Pestañas de Viewpager Fragmento y Fragmentos normales
  • Caracteres especiales en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.