我正在尝试使用Asmack API动态更新好友列表。出于测试目的,我正在使用我的Facebook帐户。我发现如果我使用我的连接登录,那么使用
adapter = new ArrayAdapter<Contact>(this, android.R.layout.simple_list_item_1, contacts);
listView.setAdapter(adapter);
Roster people = connection.getRoster();
people.people.addRosterListener(new RosterListener() {
public void presenceChanged(Presence arg0) {
contacts.clear();
for(RosterEntry entry: people.getEntries()) {
if(people.getPresence(entry.getUser()).equals(Presence.Type.available)) {
Contact person = new Contact();
person.setJid(entry.getUser());
person.setName(entry.getName());
contacts.add(person);
}
}
adapter.notifyDataSetChanged();
}
这似乎不起作用。我的listView仍然是空的。有什么想法吗?
提前致谢, 麦克
答案 0 :(得分:1)
您可以注册RosterListener
来添加,删除或更新您的朋友。请参阅doc。
答案 1 :(得分:1)
对于任何好奇的人来说,最好的方法是使用AsyncTask。最初填充它和RosterListener以使其保持最新。随着实时变化的发生。
这是我的代码。希望它能帮助将来的某个人。
@Override
public void onResume() {
super.onResume();
pd = ProgressDialog.show(this,getString(R.string.DialogConnecting1),getString(R.string.DialogConnecting2) + " " + settings.getString("username", "NOT SET") + ". " + getString(R.string.DialogConnecting3), true, true);
new ContactFetcher().execute("");
}
class ContactFetcher extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
contacts.clear();
while(connection.getRoster().getEntries().isEmpty()){}
people = connection.getRoster();
for(RosterEntry entry: people.getEntries()) {
//if(people.getPresence(entry.getUser()).getType().equals(Presence.Type.available)) {
Contact person = new Contact();
person.setJid(entry.getUser());
person.setName(entry.getName());
person.setStatus(people.getPresence(entry.getUser()));
//person.setMsgState("");
contacts.add(person);
//}
}
return "";
}
@Override
protected void onPostExecute(String result) {
adapter.sort(comparator);
adapter.notifyDataSetChanged();
pd.dismiss();
}
@Override
protected void onPreExecute() {
}
@Override
protected void onProgressUpdate(Void... values) {
}
}