返回活动后,Android ListView 不显示传入消息

Posted

技术标签:

【中文标题】返回活动后,Android ListView 不显示传入消息【英文标题】:Android ListView not displaying incomming messages after returning to the activity 【发布时间】:2015-04-17 11:33:49 【问题描述】:

我正在尝试创建一个聊天客户端,即使我遇到了问题。当我第一次打开应用程序并打开一个聊天 (ListView) 时,它运行良好。

04-17 07:19:51.681  10020-10081/com.example.example E/SENDER ANSWER:﹕ yes
04-17 07:19:55.494  10020-10081/com.example.example E/SENDER ANSWER:﹕ hi

但是当我用后面的按钮离开聊天并且我想回到窗口时它不显示收到的消息但显示地雷

在我发送“第二个”之后,另一个用户发送了:

04-17 07:21:17.246  10020-10081/com.example.example E/SENDER ANSWER:﹕ second time and doesnt work

它没有显示在列表视图上。 这是我的代码:

 protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
    chatmanager.addChatListener(new ChatManagerListener() 
                @Override
                public void chatCreated(Chat chat, boolean createdLocally) 
                if (!createdLocally) 
                    chat.addMessageListener(new ChatMessageListener() 
                        @Override
                        public void processMessage(Chat chat, Message message) 
                            Log.e("SENDER ANSWER:", message.getBody());

                            sender_messages = message.getBody();

                            runOnUiThread(new Runnable() 
                                @Override
                                public void run() 
                                    populateConversation(sender_messages, true);

                                    populateConversationView();
                                
                            );
                        

                    );
                

                
            );

也许它不必与聊天侦听器在一起,因为它正在接收消息但只是不显示。我会很感激任何帮助

public void populateConversationView()
 final ArrayAdapter<Message_Provider> adapter = new MyListAdapter();


messagesList.setTranscriptMode(AbsListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
    messagesList.setAdapter(adapter);

    adapter.registerDataSetObserver(new DataSetObserver() 
        @Override
        public void onChanged() 
            super.onChanged();
            messagesList.setSelection(adapter.getCount());
        
    );

 private class MyListAdapter extends ArrayAdapter<Message_Provider>  // Done
        public MyListAdapter()
            super(getApplicationContext(), R.layout.chat_conversation, messages);
        

        @Override
        public View getView(int position, View convertView, ViewGroup parent) 
            View itemView = convertView;
            if(itemView == null)
                itemView = getLayoutInflater().inflate(R.layout.source_message, parent, false);
            


            Message_Provider currentContact = messages.get(position);

            TextView myMessage = (TextView) itemView.findViewById(R.id.senderMessege);

            myMessage.setText(currentContact.getMessage());

            LinearLayout.LayoutParams parameter = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
            if (currentContact.getSender())
                parameter.gravity = Gravity.LEFT;
                myMessage.setBackgroundResource(R.drawable.sender_messages);

            else 
                parameter.gravity = Gravity.RIGHT;
                myMessage.setBackgroundResource(R.drawable.my_message);

            
            myMessage.setLayoutParams(parameter);


            return itemView;
        

我一整天都在测试,就像当我返回并打开一个新活动时,聊天侦听器会增加预览而不是新活动,我认为这是因为 runOnUiThread。

【问题讨论】:

让我知道你的适配器的代码。 发布您的适配器代码。人们可以更好地帮助你 我刚刚检查过,当我返回聊天时,收到的消息没有进入 populateListView 功能,我认为是因为 runOnUiThread,当我回来时它在以前的 UI 上运行 【参考方案1】:

解决了这个问题,天哪!经过数小时的调试 XD 我需要关闭侦听器中的聊天

runOnUiThread(new Runnable() 
        @Override
        public void run() 
        populateConversation(sender_messages, true);
        populateConversationView();
        chat.close(); // HERE

          
    );

我发布这个是因为有像我这样的初学者,也可能会遇到这个问题。

【讨论】:

以上是关于返回活动后,Android ListView 不显示传入消息的主要内容,如果未能解决你的问题,请参考以下文章

开始新活动后,ListView 会减少

Android中Adapter刷新数据问题

Android - 单击后保持 ListView 的项目突出显示

Android:如果同一活动中有多个 ListView,为啥我看不到 ListView?

按下小部件ListView项目时Android开始活动

Android:使用 ListView 和 Service 从应用小部件开始活动