android列表仅从一个空白处刷新,而不是从另一个空白处刷新

android列表仅从一个空白处刷新,而不是从另一个空白处刷新,android,android-listview,android-sqlite,Android,Android Listview,Android Sqlite,这对我来说很奇怪:在我的项目中(顺便说一句,它是从Yaxim派生的,所以它是一个android聊天应用程序),我试图通过messageeventlistener实现写通知。我确实收到了事件通知。为了使它出现在listview中(在另一个类中),我在数据库中添加了一行,就像它是一条消息一样(只有文本是“…”)。我添加了一个计数器,该行被正确地插入到数据库中(随后,当实际消息出现时,该行将从数据库中删除)。notifychanges也被正确调用。奇怪的是,尽管如此,该行仍然没有出现在listview

这对我来说很奇怪:在我的项目中(顺便说一句,它是从Yaxim派生的,所以它是一个android聊天应用程序),我试图通过messageeventlistener实现写通知。我确实收到了事件通知。为了使它出现在listview中(在另一个类中),我在数据库中添加了一行,就像它是一条消息一样(只有文本是“…”)。我添加了一个计数器,该行被正确地插入到数据库中(随后,当实际消息出现时,该行将从数据库中删除)。notifychanges也被正确调用。奇怪的是,尽管如此,该行仍然没有出现在listview中。如果我将过程移到下面几行,在常规消息的packetlistener上,它会被插入。然而,我不能这样离开它,因为packetlistener不能正确地接收所有的合成通知,所以它不能一直为此工作。此外,当写入通知正确插入数据库时,如果我将该过程保留在messageEventNotificationListener()中,则在实际消息到达时,写入通知消息不会被删除(并且iCount不断增加);如果我将该过程放在packetListener中,它就会放在packetListener中(因此,在消息被推入数据库后,iCount等于0)

这是messageeventlistener:

private void messageEventNotificationListener(){
    // Create a MessageEventManager
    if (mMessageEventManager == null)
        mMessageEventManager = new MessageEventManager(mXMPPConnection);
      // Add the listener that will react to the event notifications
    mMessageEventManager.addMessageEventNotificationListener(new MessageEventNotificationListener() {
          public void deliveredNotification(String from, String packetID) {
              Log.d(TAG, "The message has been delivered (" + from + ", " + packetID + ")");
          }

          public void displayedNotification(String from, String packetID) {
              Log.d(TAG, "The message has been displayed (" + from + ", " + packetID + ")");
          }

          public void composingNotification(String from, String packetID) {
              Log.d(TAG, "The message's receiver is composing a reply (" + from + ", " + packetID + ")");
              //controlla se l'utente non sta già scrivendo 
              String selection = ChatConstants.JID + " = '" + from + "' AND " +
                        ChatConstants.DELIVERY_STATUS + " = " + ChatConstants.DS_WRITING;

                Cursor cursor = mContentResolver.query(ChatProvider.CONTENT_URI,
                            new String[] { "count(" + ChatConstants._ID + ")" },
                            selection, null, null);
                cursor.moveToFirst();
                int iCount = cursor.getInt(0);
                //if (iCount == 0)
                //{
                    addChatMessageToDB(ChatConstants.INCOMING, from, "...", ChatConstants.DS_WRITING, System.currentTimeMillis(), packetID);

                //}

          }

          public void offlineNotification(String from, String packetID) {
              Log.d(TAG, "The message's receiver is offline (" + from + ", " + packetID + ")");
          }

          public void cancelledNotification(String from, String packetID) {
              Log.d(TAG, "The message's receiver cancelled composing a reply (" + from + ", " + packetID + ")");


          }
      });   

}
private void registerMessageListener() {
    // do not register multiple packet listeners
    if (mPacketListener != null)
        mXMPPConnection.removePacketListener(mPacketListener);

    PacketTypeFilter filter = new PacketTypeFilter(Message.class);

    mPacketListener = new PacketListener() {
        public void processPacket(Packet packet) {
            try {
            if (packet instanceof Message) {
                Message msg = (Message) packet;
                String chatMessage = msg.getBody();

                DeliveryReceipt dr = (DeliveryReceipt)msg.getExtension("received", DeliveryReceipt.NAMESPACE);
                if (dr != null) {
                    Log.d(TAG, "got delivery receipt for " + dr.getId());
                    changeMessageDeliveryStatus(dr.getId(), ChatConstants.DS_DELIVERED);
                }


                if (chatMessage == null)
                    return;

                if (msg.getType() == Message.Type.error) {
                    chatMessage = "<Error> " + chatMessage;
                }

                long ts;
                DelayInfo timestamp = (DelayInfo)msg.getExtension("delay", "urn:xmpp:delay");
                if (timestamp == null)
                    timestamp = (DelayInfo)msg.getExtension("x", "jabber:x:delay");
                if (timestamp != null)
                    ts = timestamp.getStamp().getTime();
                else
                    ts = System.currentTimeMillis();

                String fromJID = getJabberID(msg.getFrom());

                //elimina il messaggio "writing" se esiste
                     deleteWritingChatMessageFromDB(fromJID);

                    if (msg.getExtension("request", DeliveryReceipt.NAMESPACE) != null) {
                        // got XEP-0184 request, send receipt
                        sendReceipt(msg.getFrom(), msg.getPacketID());
                    }

                    addChatMessageToDB(ChatConstants.INCOMING, fromJID, chatMessage, ChatConstants.DS_NEW, ts, msg.getPacketID());
                    mServiceCallBack.newMessage(fromJID, chatMessage);
                }
            }
            } catch (Exception e) {
                // SMACK silently discards exceptions dropped from processPacket :(
                Log.e(TAG, "failed to process packet:");
                e.printStackTrace();
            }

    };

    mXMPPConnection.addPacketListener(mPacketListener, filter);
}
下面是packetlistener:

private void messageEventNotificationListener(){
    // Create a MessageEventManager
    if (mMessageEventManager == null)
        mMessageEventManager = new MessageEventManager(mXMPPConnection);
      // Add the listener that will react to the event notifications
    mMessageEventManager.addMessageEventNotificationListener(new MessageEventNotificationListener() {
          public void deliveredNotification(String from, String packetID) {
              Log.d(TAG, "The message has been delivered (" + from + ", " + packetID + ")");
          }

          public void displayedNotification(String from, String packetID) {
              Log.d(TAG, "The message has been displayed (" + from + ", " + packetID + ")");
          }

          public void composingNotification(String from, String packetID) {
              Log.d(TAG, "The message's receiver is composing a reply (" + from + ", " + packetID + ")");
              //controlla se l'utente non sta già scrivendo 
              String selection = ChatConstants.JID + " = '" + from + "' AND " +
                        ChatConstants.DELIVERY_STATUS + " = " + ChatConstants.DS_WRITING;

                Cursor cursor = mContentResolver.query(ChatProvider.CONTENT_URI,
                            new String[] { "count(" + ChatConstants._ID + ")" },
                            selection, null, null);
                cursor.moveToFirst();
                int iCount = cursor.getInt(0);
                //if (iCount == 0)
                //{
                    addChatMessageToDB(ChatConstants.INCOMING, from, "...", ChatConstants.DS_WRITING, System.currentTimeMillis(), packetID);

                //}

          }

          public void offlineNotification(String from, String packetID) {
              Log.d(TAG, "The message's receiver is offline (" + from + ", " + packetID + ")");
          }

          public void cancelledNotification(String from, String packetID) {
              Log.d(TAG, "The message's receiver cancelled composing a reply (" + from + ", " + packetID + ")");


          }
      });   

}
private void registerMessageListener() {
    // do not register multiple packet listeners
    if (mPacketListener != null)
        mXMPPConnection.removePacketListener(mPacketListener);

    PacketTypeFilter filter = new PacketTypeFilter(Message.class);

    mPacketListener = new PacketListener() {
        public void processPacket(Packet packet) {
            try {
            if (packet instanceof Message) {
                Message msg = (Message) packet;
                String chatMessage = msg.getBody();

                DeliveryReceipt dr = (DeliveryReceipt)msg.getExtension("received", DeliveryReceipt.NAMESPACE);
                if (dr != null) {
                    Log.d(TAG, "got delivery receipt for " + dr.getId());
                    changeMessageDeliveryStatus(dr.getId(), ChatConstants.DS_DELIVERED);
                }


                if (chatMessage == null)
                    return;

                if (msg.getType() == Message.Type.error) {
                    chatMessage = "<Error> " + chatMessage;
                }

                long ts;
                DelayInfo timestamp = (DelayInfo)msg.getExtension("delay", "urn:xmpp:delay");
                if (timestamp == null)
                    timestamp = (DelayInfo)msg.getExtension("x", "jabber:x:delay");
                if (timestamp != null)
                    ts = timestamp.getStamp().getTime();
                else
                    ts = System.currentTimeMillis();

                String fromJID = getJabberID(msg.getFrom());

                //elimina il messaggio "writing" se esiste
                     deleteWritingChatMessageFromDB(fromJID);

                    if (msg.getExtension("request", DeliveryReceipt.NAMESPACE) != null) {
                        // got XEP-0184 request, send receipt
                        sendReceipt(msg.getFrom(), msg.getPacketID());
                    }

                    addChatMessageToDB(ChatConstants.INCOMING, fromJID, chatMessage, ChatConstants.DS_NEW, ts, msg.getPacketID());
                    mServiceCallBack.newMessage(fromJID, chatMessage);
                }
            }
            } catch (Exception e) {
                // SMACK silently discards exceptions dropped from processPacket :(
                Log.e(TAG, "failed to process packet:");
                e.printStackTrace();
            }

    };

    mXMPPConnection.addPacketListener(mPacketListener, filter);
}
这两个方法都被调用到ChatProvider类中,并以
getContext().getContentResolver().notifyChange(url,null)

结果是问题不同:我发布这篇文章只是为了防止其他人在同一个问题上运行。消息实际上已插入到数据库中,但尽管packetlistener仅返回jid,但messageeventlistener也会返回jid,并在最后返回资源,这需要在插入之前删除。完成后,消息出现在列表中。另外:我发布的代码不完全正确,无法处理messageEvent。监听器需要直接从packetListener内部调用