Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
dubok79
324 / 122 / 10
Регистрация: 01.11.2012
Сообщений: 586
#1

Ошибка The content of the adapter has changed but ListView did not receive a notification

30.03.2015, 16:10. Просмотров 926. Ответов 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
Ответы с готовыми решениями:

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

Customs adapter listView
http://pastebin.ru/0GvfxEO8 помогите написать адаптер под данный item для...

TabHost, ListView и custom Adapter
Здравствуйте. В общем есть TabHost c 3 вкладками. При нажатии на вкладку ХЗ...

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

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

6
fgtmenow
75 / 75 / 7
Регистрация: 29.03.2012
Сообщений: 257
30.03.2015, 16:37 #2
ты код хотя бы приложи
0
dubok79
324 / 122 / 10
Регистрация: 01.11.2012
Сообщений: 586
30.03.2015, 16:41  [ТС] #3
Да как его тут выложишь этож не пара строк... попробую вычленить
0
fgtmenow
75 / 75 / 7
Регистрация: 29.03.2012
Сообщений: 257
30.03.2015, 16:48 #4
мы программисты, а не телепаты
0
dubok79
324 / 122 / 10
Регистрация: 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
Лучший ответ Сообщение было отмечено dubok79 как решение

Решение

У меня эта ошибка появлялась, когда изменял массив, к которому привязан адаптер и не вызывал notifyDataSetChanged на этот адаптер, или вызывал, но не сразу, а спустя какое-то время(при возвращении из бэкграунд таска).
У Вас, мне кажется, тоже что-то похожее, но с Handler-ом. Я разрешил эту ошибку возвращая новый массив из бэкграунд таска и в UI добавляя его к массиву адаптера, затем сразу вызывая notifyDataSetChanged.
1
dubok79
324 / 122 / 10
Регистрация: 01.11.2012
Сообщений: 586
30.03.2015, 18:07  [ТС] #7
max_max, спасибо. Я что-то такое и думал, но сомневался. Сделал как вы описали - работает.
0
30.03.2015, 18:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.03.2015, 18:07

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

Ошибка BIOS warning: sata devices have been changed
при включении компа вылезает окно с надписью warning: sata devices have been...

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


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

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