2012-11-24 52 views
0

我想動態更新使用Asmack API的朋友列表。出於測試目的,我正在使用我的Facebook帳戶。我發現如果我用我的連接登錄,然後使用更新朋友列表ListView與Asmack

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仍然是空的。有什麼想法嗎?

由於提前, 邁克

回答

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) { 
    } 
} 
+0

這只是一個基本的類與私人成員賈德,名字,地位,以及您的標準獲得者和制定者。我相信我也做了Parcelable。 –

1

您可以註冊RosterListener添加,刪除或更新您的朋友。請參閱doc

+0

謝謝,我更新了我的描述以更好地反映我的代碼。 –