Android, ListView IllegalStateException: «Содержимое адаптера изменилось, но ListView не получил уведомление»! - PullRequest
0 голосов
/ 16 марта 2012

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

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

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

Пожалуйста, ПОМОГИТЕ!

1 Ответ

1 голос
/ 16 марта 2012

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

...