ListView 中的 setAdapter 就像 addView 一样,而不仅仅是在 View 上添加文本

setAdapter from ListView acts like addView instead than just adding text on the View

我叫 Francesco,我正在尝试创建一个聊天应用程序,只是想看看我会花多少时间做这件事。 不幸的是,有一个东西对我来说似乎是一个错误,但也许我错了。

我有 3 个 classes:

  1. 全局 class 共享变量。
  2. 一个好友列表class。
  3. 一个聊天室class。

"buggy" 段代码进入聊天室 class。它在 FriendList class 中工作得很好,它只是使用 ListView 的方法 setAdapter 但是当它必须使用它时,它不会向 ListView 添加文本,而是添加 2 个视图(一个 autoCompleteTextView 和一个 Button),这是我在 ChatRoom class 中用来编写和发送消息的 2 个视图...

ChatRoom 的布局与 FriendList 相同,不同之处在于 ChatRoom 中有一个 autoCompleteTextView、一个用于发送消息的 Button 和 2 个 TextView 而不是一个,因为我想将不同的消息放在右边或左边取决于谁写了消息。

一段FriendList代码:

friendList = (ListView) findViewById(R.id.mainListView);

list = new ArrayList<String>();

ArrayAdapter<String> adapter = new ArrayAdapter<String>(currentActivity, R.layout.friendlist_layout, R.id.textview, list);
friendList.setAdapter(adapter);

adapter.add("francesco");
adapter.add("funkyserver");

friendList.setAdapter(adapter);

一段聊天室代码:

public void onClick(View v) {
        try {
            String messageToSend = messageInput.getText().toString();
            if (messageToSend != "" | messageToSend != null) {
                            chat.sendMessage(messageInput.getText().toString());
                    messageListAdapterR.add(messageToSend);
                    messageListAdapterL.add("");
                    currentActivity.runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                                messageListView.setAdapter(messageListAdapterL);
                                messageListView.setAdapter(messageListAdapterR);
                        }
                    });
            }

       ...

p.s。这两个代码都进入了 runOnUiThread。

提前感谢您的回复:)

当您修改附加到绑定到 ListView 的适配器的数据时,您不会再次调用 setAdapter() 来更新视图。这就是 notifyDataSetChanged() 的用途。您的第一个伪代码示例应该看起来更像这样:

friendList = (ListView) findViewById(R.id.mainListView);

list = new ArrayList<String>();

ArrayAdapter<String> adapter = new ArrayAdapter<String>(currentActivity,
        R.layout.friendlist_layout, R.id.textview, list);
friendList.setAdapter(adapter);

adapter.add("francesco");
adapter.add("funkyserver");

adapter.notifyDataSetChanged();

实际上,更准确地说,直接向适配器添加项目时,甚至 notifyDataSetChanged() 都不应该是必需的……它应该在内部调用该方法。

关于您的第二个示例,ListView 无法显示来自多个适配器的数据。当您的代码调用时:

messageListView.setAdapter(messageListAdapterL);
messageListView.setAdapter(messageListAdapterR);

第二个方法调用 覆盖 第一个,您将看到的都是 messageListAdapterR 中的项目。如果您希望来自两个 "lists" 的数据都显示在视图中,则必须将它们合并到一个适配器中。