Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
dubok79
323 / 121 / 11
Регистрация: 01.11.2012
Сообщений: 586
#1

Ошибка The content of the adapter has changed but ListView did not receive a notification - Программирование Android

30.03.2015, 16:10. Просмотров 568. Ответов 6
Метки нет (Все метки)

Прошу помощи, т.к. уже не знаю, что делать. Наверное нахватает знаний.
На одном единственном телефоне постоянно вылетает ошибка
The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread. Make sure your adapter calls notifyDataSetChanged() when its content changes
Я уже весь код перелазил, не обращаюсь я к элементам интерфейса в фоновом потоке, только после выполнения всех действий через Handler в UI потоке говорю адаптеру обновиться. Телефон с Андроид 4.4.2 Пробовал на планшете с этой же версией Андроида, на более старых - нигде нет такой ошибки. Что посоветуете? Могу код весь выложить, если нужно. Спасибо.

Добавлено через 15 минут
Добавил метод .setNotifyOnChange(true); но даже это не помогло...
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fgtmenow
75 / 75 / 7
Регистрация: 29.03.2012
Сообщений: 254
30.03.2015, 16:37     Ошибка The content of the adapter has changed but ListView did not receive a notification #2
ты код хотя бы приложи
dubok79
323 / 121 / 11
Регистрация: 01.11.2012
Сообщений: 586
30.03.2015, 16:41  [ТС]     Ошибка The content of the adapter has changed but ListView did not receive a notification #3
Да как его тут выложишь этож не пара строк... попробую вычленить
fgtmenow
75 / 75 / 7
Регистрация: 29.03.2012
Сообщений: 254
30.03.2015, 16:48     Ошибка The content of the adapter has changed but ListView did not receive a notification #4
мы программисты, а не телепаты
dubok79
323 / 121 / 11
Регистрация: 01.11.2012
Сообщений: 586
30.03.2015, 16:53  [ТС]     Ошибка The content of the adapter has changed but ListView did not receive a notification #5
Ну вот код
Кликните здесь для просмотра всего текста

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
public class MainActivity extends FragmentActivity 
    implements OnRefreshListener {
 
    private ListView lv;
    private LinkedList<DataEntity> data = new LinkedList<DataEntity>();
    private SwipeRefreshLayout swipeLayout;
    private CustomAdapter adapter;
    private HandlerLoadData handler;
 
    @SuppressLint("NewApi")
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        handler = new HandlerLoadData(this);
        
        swipeLayout = (SwipeRefreshLayout) findViewById(R.id.SwipeRefreshLayout);
        swipeLayout.setOnRefreshListener(this);
        
        lv = (ListView) findViewById(R.id.lv);
        
        data.clear();
        adapter = new CustomAdapter(getApplicationContext(), R.layout.item, R.id.txtDate, data);
        adapter.setNotifyOnChange(true);
        lv.setAdapter(adapter);
        //обновляем список в отдельном потоке
        updateListView(false);
      }
     
      private void setAdapterFromDB(String where, String[] where_args, String mode){
        //тут наполняем список записями из БД
        data.add(new DataEntity(......));
      }     
 
    /**метод обновления списка*/
    @SuppressWarnings("deprecation")
    private void updateListView(boolean restore){
        lvindex = lv.getFirstVisiblePosition();
        View v = lv.getChildAt(0);
        lvposition = (v == null) ? 0 : v.getTop();
        lvrestore = restore;
        showDialog(DLG_PROGRESS); // Показываем диалог прогресса
        mPrev = 0;
        // Запускаем в отдельном потоке загрузку данных
        new Thread(new Runnable() {
            public void run() {             
                data.clear();
                setAdapterFromDB(null,null,"");
                handler.sendEmptyMessage(0); // посылаем уведомление об окончании загрузки
            }
        }).start();
    }
    
    private class GetDataTask extends AsyncTask<Void, Void, String[]> {
        @Override
        protected void onPostExecute(String[] result) {
            setDataAdapter("");         
            swipeLayout.setRefreshing(false);
            super.onPostExecute(result);
        }
 
        @Override
        protected String[] doInBackground(Void... params) {
            updateListView_PullRefresh();
            return null;
        }
    }
    
    static class HandlerLoadData extends Handler {
        WeakReference<MainActivity> wrActivity;
        public HandlerLoadData(MainActivity activity) {
            wrActivity = new WeakReference<MainActivity>(activity);
        }
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            MainActivity activity = wrActivity.get();
            if (activity != null) activity.closeDialogLoadData();
        }
    }
 
    @SuppressWarnings("deprecation")
    public void closeDialogLoadData() {
        dismissDialog(DLG_PROGRESS);
        setDataAdapter("");
        if(lvrestore) lv.setSelectionFromTop(lvindex, lvposition);// restore index and position
    }     
 
    private void setDataAdapter(String strFind){
        adapter.sort(new DateSort());
        adapter.notifyDataSetChanged();
    }
    
    @Override
    public void onRefresh() {
        swipeLayout.setRefreshing(true);
        new GetDataTask().execute();
    }
}
max_max
5 / 5 / 1
Регистрация: 12.08.2014
Сообщений: 26
30.03.2015, 17:41     Ошибка The content of the adapter has changed but ListView did not receive a notification #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
У меня эта ошибка появлялась, когда изменял массив, к которому привязан адаптер и не вызывал notifyDataSetChanged на этот адаптер, или вызывал, но не сразу, а спустя какое-то время(при возвращении из бэкграунд таска).
У Вас, мне кажется, тоже что-то похожее, но с Handler-ом. Я разрешил эту ошибку возвращая новый массив из бэкграунд таска и в UI добавляя его к массиву адаптера, затем сразу вызывая notifyDataSetChanged.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.03.2015, 18:07     Ошибка The content of the adapter has changed but ListView did not receive a notification
Еще ссылки по теме:
Android Ошибка добавления списка контактов в ListView
Ошибка при выборе Item в ListView Android
Ошибка при инициализации ListView в ViewPager Android
Notification sound Android
Уведомления Notification Android

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
dubok79
323 / 121 / 11
Регистрация: 01.11.2012
Сообщений: 586
30.03.2015, 18:07  [ТС]     Ошибка The content of the adapter has changed but ListView did not receive a notification #7
max_max, спасибо. Я что-то такое и думал, но сомневался. Сделал как вы описали - работает.
Yandex
Объявления
30.03.2015, 18:07     Ошибка The content of the adapter has changed but ListView did not receive a notification
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru