2012-03-16 10 views
0

基本的に、私はインターフェイスを実装し、いくつかの継承された関数を持つアクティビティを持っています。これらの関数はそれぞれ呼び出され、Listアダプタの更新に使用されるデータを渡します。私は前に任意のソリューションを見てきたので、私はハンドラに機能ごとに作業を渡し、Android、ListView IllegalStateException: "アダプタの内容は変更されましたが、ListViewは通知を受け取りませんでした"

@Override 
public void onEntriesAdded(List<String> addresses) throws RemoteException { 
    Log.v(TAG, "Entries Added notify!"); 
    listEntriesAdd.clear(); 
    listEntriesAdd = addresses; 
    rosterHandler.sendEmptyMessage(1); 
} 

@Override 
public void onEntriesUpdated(List<String> addresses) throws RemoteException { 
    Log.v(TAG, "Entries Updated notify!"); 
    listEntriesUpdate.clear(); 
    listEntriesUpdate = addresses; 
    rosterHandler.sendEmptyMessage(2); 
} 

@Override 
public void onEntriesDeleted(List<String> addresses) throws RemoteException { 
    Log.v(TAG, "onEntries deleted " + addresses); 
    listEntriesDel.clear(); 
    listEntriesDel = addresses; 
    rosterHandler.sendEmptyMessage(3); 
} 

:これはスニペットです

private Handler rosterHandler = new Handler() { 

    @Override 
    public void handleMessage(Message msg) { 
     switch(msg.what) { 
     case 0: 
      // adding or any List<String> elements operations 
      break; 

     case 1: 
      // adding or any List<String> elements operations 
      break; 

     case 2: 
      // adding or any List<String> elements operations 
      break; 

     case 3: 
      // adding or any List<String> elements operations 
      break; 

     case 4: 
      // adding or any List<String> elements operations 
      break; 
     } 
     mAdapterContact.notifyDataSetChanged(); 
    } 
}; 

してから、だろうServiceConnectionクラスがあります私はbindServiceを実行したときに呼び出さ:

@Override 
protected void onResume() { 
super.onResume(); 
    if (!mBinded) { 
     Log.d(TAG, "Request BIND Service"); 
     mBinded = bindService(SERVICE_INTENT, mServConn, BIND_AUTO_CREATE); 
    } 
} 

とサービスクラス:

private class MyServiceConnection implements ServiceConnection { 

public MyServiceConnection() { 
} 

@Override 
public void onServiceConnected(ComponentName name, IBinder service) { 
    globalBinder = service; 
    mXmppFacade = IXmppFacade.Stub.asInterface(service); 
    try { 
    mRoster = mXmppFacade.getRoster(); 
    if (mRoster != null) { 
     Log.i(TAG, "REBUILD ROSTER!!!"); 
     rosterHandler.sendEmptyMessage(0);// send it to handler 
    } 
    } catch (RemoteException e) { 
    e.printStackTrace(); 
    } 
} 

@Override 
public void onServiceDisconnected(ComponentName name) { 
    try { 
    mRoster.removeRosterListener(ContactList.this); 
    } catch (RemoteException e) { 
    e.printStackTrace(); 
    } 
    mXmppFacade = null; 
    mChatManager = null; 
    mRoster = null; 
    mListContact.clear(); 
    mListGroup.clear(); 
    mContactOnGroup.clear(); 
    mBinded = false; 
} 
} 

私は現在、リストを実際には、このような拡張リストビューを更新しています... しかし、このエラーが発生するたびにAndroid、ListView IllegalStateException: "アダプタの内容は変更されましたが、ListViewは通知を受信しない "!

私は本当に混乱し、私はこのエラーを回避するために、適切にこれらの手順を配置し、まだ私のリストを更新することができますかわからない:(

助けてください!

+0

notifyDataSetChanged()を呼び出そう。本当のリストアダプタですが、使用していませんでした'notifyDataChanged'を実行すると、このエラーがスローされます。上のコードから、私はあなたのアダプタのデータがどのリストであるか知りません。 – idiottiger

答えて

1

は、UIスレッド上でmAdapterContact.notifyDataSetChanged();を実行してみます(Activity.RunOnUIThread)、およびダブルチェックmAdapterContactは また、お使いのアダプタの内容が変更されており、アダプタがビューを更新する必要がとき右setAdapter()

+0

あなたの活動の中にスレッドを追加する必要がありますか?実際には、onCreateを実行するとsetAdapterが呼び出されますが、おかげで試してみます – user724861

+0

そのサービスは他のスレッドでメッセージを送信することができ、問題になることがあります。 –

+0

私の目は悪いです申し訳ありません:p list.setAdapter(new ContactGroupAdapter(this、mGroup、mChild)); – user724861