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 ).
- Problemas en eclipse: java.lang.ClassCastException
- Prueba de elección múltiple y de elección única
- Excepción en el daemon del finalizador
- Android: No se puede obtener un encabezado / pie de lista ListView que se puede hacer clic
- ¿Cómo puedo comprobar si mi tabla sqlite contiene datos?
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
Notificación
- Desactivar la sobrecarga agresiva en ProGuard para Android
- NetBeans y parada / interrupción en todas las excepciones?
- Forzar libgdx de Android en modo inmersivo
- Array límites en java y .length
- Dibuja una ruta siguiendo tu ubicación en Google Maps para Android
- Phonegap CLI con Java 8
- Cómo solucionar el error como java.lang.Throwable: setStateLocked?
- Creación de Geofence en diferentes usuarios
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());
- Temporizador CountDown – Cómo Mostrar Año, Meses, Semanas así
- Dispositivo Android detectado conectado a la PC