【发布时间】:2016-04-28 15:32:34
【问题描述】:
我有一个使用 ViewPager 和 Fragments 来创建标签的应用程序。
在我的应用程序中,我有一个聊天功能。每当接收或发送聊天时,它都会存储在数据库的表中。接收到的聊天来自不同的线程,并且用户的聊天被输入到聊天片段中的 EditText 窗口中。
我有一个名为“LogChat.java”的类,可以将聊天记录保存到数据库中。
我有一个由 SimpleCursorAdapter 支持的 ListView,它显示聊天。此 ListView 在我的应用程序的聊天片段中。
一切正常,除了 ListView 不会自动刷新以显示最新聊天。在聊天片段中,我有这个方法来显示聊天:
displayChats()
public void displayChats(){
DatabaseHelper databaseHelper = new DatabaseHelper(getActivity());
Cursor chatsCursor = databaseHelper.getChatsCursor();
String[] fromColumns = {chatInfo, chatContent};
int[] toViews = {R.id.chat_info, R.id.chat_content};
SimpleCursorAdapter simpleCursorAdapter = new SimpleCursorAdapter(getContext(), R.layout.line_of_chat, chatsCursor, fromColumns, toViews, 0);
ListView listView = (ListView) rootView.findViewById(R.id.chat_text_display);
listView.setAdapter(simpleCursorAdapter);
databaseHelper.close();
}
我有这个从输入中读取聊天,并将其保存到数据库中:
getView()
@Override
public View getView(){
Button sendChatButton = (Button) rootView.findViewById(R.id.send_chat_button);
EditText chatEntryWindow = (EditText) rootView.findViewById(R.id.chat_entry_window);
sendChatButton.setOnClickListener(new View.OnClickListener(){
String message = chatEntryWindow.getText().toString();
LogChat logChat = new LogChat();
logChat.addMessage(message);
displayChats();
});
}
在侦听器线程中,我传入对 Main Activity 的引用,并使用它将聊天发送到 LogChat.java 以存储在数据库中:
Listener.java
public class Listener implements Runnable(){
private MainActivity mainActivity;
public Listener(MainActivity mainActivity){
this.mainActivity = mainActivity;
}
@Override
public void run(){
LogChat logChat = new LogChat();
logChat.addMessage(message);
}
}
就像我说的,这一切都有效,除了刷新 ListView 以显示新收到的聊天记录。我成功地存储了所有聊天(用户和所有收到的聊天),如果我的操作方式很棘手(即输入本地聊天),它们将正确显示在我的 ListView 中。
现在,为了查看收到的聊天,我必须在本地输入一个聊天,它调用 displayChats() 方法,该方法会更新 ListView,它会在 ListView 中显示我输入的聊天和所有其他最近收到的聊天。
我知道我应该使用notifyDataSetChanged(),但我终其一生都无法弄清楚如何使用它。一段时间以来,我一直在努力思考它,但我就是无法“明白”。
我知道我应该像这样在 simpleCursorAdapter 变量上调用 notifyDataSetChanged():
simpleCursorAdapter.notifyDataSetChanged();
但我不确定如何从我的 LogChats 类或我的侦听器线程中访问它。或者,就此而言,来自使用 SimpleCursorAdapter 的同一类的 getView() 方法。我认为从 LogChats 类中执行此操作是一个好主意,因此有一个中心点可以将聊天记录在数据库并在一处刷新视图。
我知道notifyDataSetChanged() 一直在使用,所以我想我只是无法弄清楚如何正确使用它,但我仍然被阻止了。
【问题讨论】:
标签: android listview android-fragments simplecursoradapter