Форум программистов, компьютерный форум 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. Просмотров 642. Ответов 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); но даже это не помогло...
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.03.2015, 16:10
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибка The content of the adapter has changed but ListView did not receive a notification (Программирование Android):

ListView Template. View property - null, по selection changed нет выбранного элемента - C# WPF
имеются два ListView: <ListView x:Name="lv0" Template="{DynamicResource lvTemplate}" ItemsSource="{Binding collection}"> ...

Customs adapter listView - Программирование Android
http://pastebin.ru/0GvfxEO8 помогите написать адаптер под данный item для listView. Толи мозгов, толи опыта мало. Надо - реализовать...

TabHost, ListView и custom Adapter - Программирование Android
Здравствуйте. В общем есть TabHost c 3 вкладками. При нажатии на вкладку ХЗ показаться данные в ListView, но у меня при нажатии на эту...

Listview, adapter получение информации из нажатого элемента списка - Программирование Android
Есть список, который заполняется из базы данных. Мне нужно через контекстное меню удалить этот элемент из списка и исходя из информации,...

Ошибка: changed database context to ' ' - SQL Server
Здравствуйте уважаемые!!! Есть asp проект, который цепляется с MS SQL 2005. Периодически при добавлении новой записи, возникает...

Your content must have a ListView whose id attribute is 'android.R.id.list' - как правильно создать адаптор ? - Программирование Android
Добрый день. Помогите разобраться с вопросом. Как правильно формировать адаптер для ListView? беру данные из BD. Результат у меня...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
fgtmenow
75 / 75 / 7
Регистрация: 29.03.2012
Сообщений: 254
30.03.2015, 16:37 #2
ты код хотя бы приложи
0
dubok79
323 / 121 / 11
Регистрация: 01.11.2012
Сообщений: 586
30.03.2015, 16:41  [ТС] #3
Да как его тут выложишь этож не пара строк... попробую вычленить
0
fgtmenow
75 / 75 / 7
Регистрация: 29.03.2012
Сообщений: 254
30.03.2015, 16:48 #4
мы программисты, а не телепаты
0
dubok79
323 / 121 / 11
Регистрация: 01.11.2012
Сообщений: 586
30.03.2015, 16:53  [ТС] #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();
    }
}
0
max_max
5 / 5 / 1
Регистрация: 12.08.2014
Сообщений: 26
30.03.2015, 17:41 #6
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
У меня эта ошибка появлялась, когда изменял массив, к которому привязан адаптер и не вызывал notifyDataSetChanged на этот адаптер, или вызывал, но не сразу, а спустя какое-то время(при возвращении из бэкграунд таска).
У Вас, мне кажется, тоже что-то похожее, но с Handler-ом. Я разрешил эту ошибку возвращая новый массив из бэкграунд таска и в UI добавляя его к массиву адаптера, затем сразу вызывая notifyDataSetChanged.
1
dubok79
323 / 121 / 11
Регистрация: 01.11.2012
Сообщений: 586
30.03.2015, 18:07  [ТС] #7
max_max, спасибо. Я что-то такое и думал, но сомневался. Сделал как вы описали - работает.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.03.2015, 18:07
Привет! Вот еще темы с ответами:

Ошибка: name lookup of 'k' changed for ISO 'for' scoping [-fpermissive] - C++
Не компилируется код, выдает ошибки: name lookup of 'k' changed for ISO 'for' scoping (if you use '-fpermissive' G++ will accept...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
30.03.2015, 18:07
Ответ Создать тему
Опции темы

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