0

我正在尝试使用 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 仍然是空的。有什么想法吗?

在此先感谢,迈克

4

2 回答 2

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) {
    }
}
于 2012-11-25T17:45:22.350 回答
1

您可以注册一个RosterListener来添加、删除或更新您的朋友。请参阅文档

于 2012-11-25T00:07:01.233 回答