Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
1 / 1 / 0
Регистрация: 28.06.2017
Сообщений: 49

Обновление ListView в таймере

22.08.2017, 15:53. Показов 1351. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, не могу понять почему listview не обновляется каждую секунду. Подскажите в чем проблема, что не так?

Вот код activity onCreate:
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    public ListView listView;
    public AdapterBus adapterBus;
    public List<Bus> busList;
 
@Override
    protected void onCreate(Bundle savedInstanceState) 
{
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_scrolling);
 
        listView = (ListView) findViewById(R.id.lv);
        busList = new ArrayList<>();
        busList.add(new Bus(1, "Москва ", "Питер", "23:00", "8:10", "31", "4200",
                "Москва - Питер", "ежедневно", "в пути", R.drawable.buses_green));
 
        dbAdapter = new DBAdapter(ScrollingActivity.this);
        adapterBus = new AdapterBus(getApplicationContext(), busList);
        listView.setAdapter(adapterBus);
 
       //сам таймер
       Timer timer = new Timer();
        timer.schedule(new refresh(), 0, 1000);
}


Код класса refresh:
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class refresh extends TimerTask
    {
 
        private String a = "a";
 
        @Override
        public void run() {
 
            busList.get(0).setStatus(statusBus("15:45"));
            adapterBus = new AdapterBus(ScrollingActivity.this, busList);
 
                adapterBus.notifyDataSetChanged();
 
 
            //statusBus это метод который возвращает время в виде строки
            Log.d("+++", statusBus("15:45"));
        }
    }
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.08.2017, 15:53
Ответы с готовыми решениями:

Обновление ListView
Доброго времени суток. Недавно столкнулся с такой проблемой. В активити есть ListView, в которое посредством адаптера добавляются...

ListView обновление
Пытаюсь запилить органайзер, сделал добавление в базу и вывод в ListView. Но проблема, если добавить запись, то она появится только после...

Обновление listview
Добрый день, у меня listview выводится через адаптер. По нажатию на чекбокс, меняется текст в listview. Как обновить listview, чтобы он...

21
66 / 56 / 6
Регистрация: 28.12.2011
Сообщений: 322
22.08.2017, 17:34
Цитата Сообщение от create Посмотреть сообщение
adapterBus = new AdapterBus(ScrollingActivity.this, busList);
Это в классе refresh зачем?
0
1 / 1 / 0
Регистрация: 28.06.2017
Сообщений: 49
22.08.2017, 17:42  [ТС]
ну как я понял, чтобы обновить ListView на работать с адаптером. А класс refresh это выполняет. Возможно, это не правильно..
0
66 / 56 / 6
Регистрация: 28.12.2011
Сообщений: 322
22.08.2017, 17:44
Цитата Сообщение от create Посмотреть сообщение
чтобы обновить ListView на работать с адаптером
Верно...

Ты понимаешь что выполняет эта строчка кода?
0
1 / 1 / 0
Регистрация: 28.06.2017
Сообщений: 49
22.08.2017, 17:46  [ТС]
Выделение памяти для adapterBus
0
66 / 56 / 6
Регистрация: 28.12.2011
Сообщений: 322
22.08.2017, 17:51
В общем ты этой строчкой кода заново инициализируешь объект adapterBus. Соответственно от получает новую ссылку, о которой в listview ничего не известно. Для того, чтобы данные в listview менялись тебе нужно ОДИН раз инициализировать объект adapterBus, как ты и сделал в методе onCreate, и менять данные именно в этом адаптере.
0
1 / 1 / 0
Регистрация: 28.06.2017
Сообщений: 49
22.08.2017, 17:54  [ТС]
Т.е. таким образом?

Java
1
2
3
4
5
6
7
8
9
public class refresh extends TimerTask
    {
        @Override
        public void run() {
 
            busList.get(0).setStatus(statusBus("15:45"));
            adapterBus.notifyDataSetChanged();
        }
    }
0
66 / 56 / 6
Регистрация: 28.12.2011
Сообщений: 322
22.08.2017, 17:55
именно
0
1 / 1 / 0
Регистрация: 28.06.2017
Сообщений: 49
22.08.2017, 18:11  [ТС]
Я попробовал запустить с этим кодом но, все равно вылетает приложение ...
0
66 / 56 / 6
Регистрация: 28.12.2011
Сообщений: 322
22.08.2017, 18:49
читайте лог
0
1 / 1 / 0
Регистрация: 28.06.2017
Сообщений: 49
22.08.2017, 21:00  [ТС]
Я перевел первую строку: Android.view.ViewRootImpl $ CalledFromWrongThreadException: только исходный поток, создавший иерархию представлений, может коснуться его представлений.

Разве таймер это поток?
А вот лог:
Кликните здесь для просмотра всего текста

08-22 15:53:14.852 3527-3540/? E/AndroidRuntime: FATAL EXCEPTION: Timer-0
Process: com.example.eminem.sac, PID: 3527
android.view.ViewRootImpl$CalledFromWron gThreadException: Only the original thread that created a view hierarchy can touch its views.
at android.view.ViewRootImpl.checkThread(Vi ewRootImpl.java:6094)
at android.view.ViewRootImpl.requestLayout( ViewRootImpl.java:824)
at android.view.View.requestLayout(View.jav a:16431)
at android.view.View.requestLayout(View.jav a:16431)
at android.view.View.requestLayout(View.jav a:16431)
at android.view.View.requestLayout(View.jav a:16431)
at android.view.View.requestLayout(View.jav a:16431)
at android.view.View.requestLayout(View.jav a:16431)
at android.view.View.requestLayout(View.jav a:16431)
at android.support.v4.widget.NestedScrollVi ew.requestLayout(NestedScrollView.java:1 617)
at android.view.View.requestLayout(View.jav a:16431)
at android.view.View.requestLayout(View.jav a:16431)
at android.widget.AbsListView.requestLayout (AbsListView.java:1916)
at android.widget.AdapterView$AdapterDataSe tObserver.onChanged(AdapterView.java:814 )
at android.widget.AbsListView$AdapterDataSe tObserver.onChanged(AbsListView.java:628 0)
at android.database.DataSetObservable.notif yChanged(DataSetObservable.java:37)
at android.widget.BaseAdapter.notifyDataSet Changed(BaseAdapter.java:50)
at com.example.eminem.sac.ScrollingActivity $refresh.run(ScrollingActivity.java:437)
at java.util.Timer$TimerImpl.run(Timer.java :284)


Добавлено через 2 часа 0 минут
Нашел в интернете такой способ
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//это в onCreate
Timer t = new Timer();
        //Set the schedule function and rate
        t.scheduleAtFixedRate(
                new TimerTask()
                {
 
                    @Override
                    public void run()
                    {
                        runOnUiThread(
                                new Runnable() {
 
                                    @Override
                                    public void run() {
 
                                        busList.get(0).setStatus(statusBus("12:45"));
                                        adapterBus.notifyDataSetChanged();
                                    }
                                });
                    }
                } ,0,500);
Не понимаю, почему мой способ не работает...
0
66 / 56 / 6
Регистрация: 28.12.2011
Сообщений: 322
23.08.2017, 01:11
Цитата Сообщение от create Посмотреть сообщение
Не понимаю, почему мой способ не работает...
Выполнять обновление view компонентов, коим является listview, нужно из главного потока приложения, вы это пытаетесь сделать из потока, который был создан классом refresh. На форуме тонна тем с аналогичной ошибкой.
0
 Аватар для dedlovscky
16 / 11 / 0
Регистрация: 06.03.2015
Сообщений: 162
23.08.2017, 11:42
Посмотрите про AsyncTask
0
 Аватар для petruchodd
129 / 126 / 22
Регистрация: 23.06.2009
Сообщений: 700
23.08.2017, 14:34
в runOnUiThread нужно выполнять. Иначе exception будет.
Все изменения с View где нужно что-то обновить выполняются только через runOnUiThread.
0
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
23.08.2017, 14:42
код каличный от начала до конца

все делается на RecyclerView
если надо обновлять какой-то или все сразу элементы то в активити заводится хоть Timertask хоть через postDelayed хоть через Executors.newSingleThreadScheduledExecut or().scheduleAtFixedRate()
периодическая задача, которая будет делать примерно так
Java
1
2
3
4
5
6
        recyclerView.post(new Runnable() {
            @Override
            public void run() {
                recyclerView.getAdapter().notifyItemChanged(позиция элемента который надо обновить);
            }
        });
а магия с текстом должна происходить в холдере
после notifyItemChanged будет вызван метод onBindViewHolder где и надо обновить текст
1
1 / 1 / 0
Регистрация: 28.06.2017
Сообщений: 49
23.08.2017, 19:33  [ТС]
Что значит код "каличный от начала до конца"?
0
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
23.08.2017, 19:41
лучше бы ты прочитал внимательно другую часть моего сообщения
0
1 / 1 / 0
Регистрация: 28.06.2017
Сообщений: 49
23.08.2017, 19:55  [ТС]
Я прочитал, но как-то все сложно.

Добавлено через 2 минуты
recyclerView это объект RecyclerView, как я понял
0
11 / 10 / 1
Регистрация: 09.08.2017
Сообщений: 62
23.08.2017, 20:50
Вы в отдельном потоке работаете с View, так нельзя без использования AsyncTask!!!!!! Да и вообще, пора бы уже пользоваться RecyclerView, а не ListView!
0
66 / 56 / 6
Регистрация: 28.12.2011
Сообщений: 322
24.08.2017, 09:21
Цитата Сообщение от create Посмотреть сообщение
каличный от начала до конца
Не обращай внимание, пройдет время, ты наберешься опыта, и сам поймешь, что код каличный.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.08.2017, 09:21
Помогаю со студенческими работами здесь

Обновление ListView
Есть активити с ListView с записями из БД. Записи добавляются в onCreate() активити. Допустим, удалил я запись из БД через диалоги. ...

обновление switch в listview/
Здравствуйте. У меня есть такой адаптер. И проблема что когда я нажимаю на switch его положение естественно записывает в базе, но вот при...

Периодическое обновление ListView
Привет всем! Есть задача, вывести на экран список, данные берутся с сервера, а потом с какой то периодичностью обновлять его с сервера. ...

Обновление фрагмента с ListView в ViewPager
Есть класс фрагмента, который заполняет адаптер: public class PageFragment extends Fragment implements LoaderCallbacks&lt;Cursor&gt; { ...

Обновление ListView после добавления записи
Выбираю записи из БД и вывожу их в ListView. В этом же активити есть кнопка добавления записи в БД. После добавления я хочу что б эта...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru