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="tijme@192.168.137.1" type="chat" from="test@192.168.137.1/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="tijme@192.168.137.1" type="chat" from="test@192.168.137.1/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="tijme@192.168.137.1" type="chat" from="test@192.168.137.1/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()); 
  • Cierre de la conexión Jsoup
  • Catering para dispositivos que ejecutan frijol Jelly así como versiones posteriores a Jelly bean cuando se obtiene el uso de datos de la aplicación
  • Diferencia entre system.gc () y runtime.gc ()
  • El dispositivo Android no muestra la imagen de fondo
  • Android Studio no pudo encontrar un Jvm válido (relacionado con MAC OS)
  • NPE: CursorTreeAdapter $ MyCursorHelper.changeCursor (Cursor, boolean) 'en una referencia de objeto nulo
  • Notificación de Android después de que la aplicación está instalada en el dispositivo - ¿Cómo?
  • Quitar elementos de HashMap por clave en java
  • Error al resolver: Error: (23, 17) junit: junit: 4.12 en android studio 1.4
  • Android instrumentación prueba java.lang.UnsatisfiedLinkError en el uso de AndroidJunitRunner y AndroidJUnit4
  • Excepción generada durante la renderización: TabHost requiere un TabWidget con id "android: id / tabs"
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.