ListView 中的 setAdapter 就像 addView 一样,而不仅仅是在 View 上添加文本
setAdapter from ListView acts like addView instead than just adding text on the View
我叫 Francesco,我正在尝试创建一个聊天应用程序,只是想看看我会花多少时间做这件事。
不幸的是,有一个东西对我来说似乎是一个错误,但也许我错了。
我有 3 个 classes:
- 全局 class 共享变量。
- 一个好友列表class。
- 一个聊天室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" 的数据都显示在视图中,则必须将它们合并到一个适配器中。
我叫 Francesco,我正在尝试创建一个聊天应用程序,只是想看看我会花多少时间做这件事。 不幸的是,有一个东西对我来说似乎是一个错误,但也许我错了。
我有 3 个 classes:
- 全局 class 共享变量。
- 一个好友列表class。
- 一个聊天室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" 的数据都显示在视图中,则必须将它们合并到一个适配器中。