Android, ListView IllegalStateException: «Содержимое адаптера изменилось, но ListView не получил уведомления»!

Итак, в основном у меня есть Activity, который реализует интерфейс и имеет несколько унаследованных функций. каждая из этих функций будет вызываться и передавать данные, которые будут использоваться для обновления моего адаптера List. это фрагмент:

@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 не получил уведомление »!

Я действительно запутался, я не знаю, где правильно разместить эти процедуры, чтобы избежать этой ошибки, и все же могу обновить свой список :(

Пожалуйста помоги!


person user724861    schedule 16.03.2012    source источник
comment
когда содержимое вашего адаптера было изменено и адаптеру необходимо обновить представление, но вы не использовали notifyDataChanged, он выдаст эту ошибку. из приведенного выше кода я не знаю, в каком списке указаны данные вашего адаптера.   -  person idiottiger    schedule 16.03.2012


Ответы (1)


Попробуйте запустить mAdapterContact.notifyDataSetChanged(); в потоке пользовательского интерфейса (Activity.RunOnUIThread) и дважды проверьте, что mAdapterContact - это реальный адаптер списка. Также попробуйте позвонить notifyDataSetChanged() сразу после setAdapter()

person Roman Truba    schedule 16.03.2012
comment
ты имеешь в виду, что мне нужно добавить больше веток в мою деятельность? На самом деле, я вызываю setAdapter только при onCreate ... но спасибо, я попробую - person user724861; 16.03.2012
comment
Я имею в виду, что эта служба может отправлять сообщения в другом потоке, и это может быть проблемой. - person Roman Truba; 16.03.2012
comment
мои глаза плохи, извините: p list.setAdapter (new ContactGroupAdapter (this, mGroup, mChild)); - person user724861; 18.03.2012