Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Ujin778
0 / 0 / 0
Регистрация: 03.02.2015
Сообщений: 5
#1

Периодическое обновление ListView - Программирование Android

03.02.2015, 12:24. Просмотров 1170. Ответов 11
Метки нет (Все метки)

Привет всем!
Есть задача, вывести на экран список, данные берутся с сервера, а потом с какой то периодичностью обновлять его с сервера.
Список есть, при создании активити он загружается и отображается:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        GSMGPSSender.getList();//Это обновление данных в базе с сервера
        
        // формируем столбцы сопоставления
        String[] from = new String[] { DB.COLUMN_SLCT, DB.COLUMN_IMG, DB.COLUMN_TXT, DB.COLUMN_STS1, DB.COLUMN_STS2, DB.COLUMN_STS3, DB.COLUMN_STS4, DB.COLUMN_STS5, DB.COLUMN_STS6, DB.COLUMN_STS7 };
        int[] to = new int[] { R.id.ivSlct, R.id.ivImg, R.id.tvText, R.id.ivSts1, R.id.ivSts2, R.id.ivSts3, R.id.ivSts4, R.id.ivSts5, R.id.ivSts6, R.id.ivSts7 };
 
        // создааем адаптер и настраиваем список
        scAdapter = new SimpleCursorAdapter(this, R.layout.item, null, from, to, 0);
        lvData = (ListView) findViewById(R.id.lvData);
        lvData.setAdapter(scAdapter);
 
        // добавляем контекстное меню к списку
        registerForContextMenu(lvData);
        
        // создаем лоадер для чтения данных
        getSupportLoaderManager().initLoader(0, null, this);
сделал для начала обновление при нажатии кнопки, работает правильно:
http://www.cyberforum.ru/android-dev/thread977976.html
Java
1
2
3
4
    public void onButton1Click(View view) {
          GSMGPSSender.getList();//Это обновление данных в базе с сервера
          getSupportLoaderManager().getLoader(0).forceLoad();//обновляем список на экран
      }
Для того чтобы обновлять данные раз в минуту, сделал TimerTask, вот ее запуск:
Java
1
t.schedule(new GetPosTask(), new Date(0), 60000);
а вот сам таск:
Java
1
2
3
4
5
6
7
8
class GetPosTask extends TimerTask {
    public static final String TAG = GetPosTask.class.getName();
 
    @Override
    public void run() {
        GSMGPSSender.getList();//Обновление данных в базе вроде работает
        }
}
Но столкнулся с проблемой - как обновить данные на экране, функция, которая обновляет данные на экране:
Java
1
getSupportLoaderManager().getLoader(0).forceLoad();//обновляем список на экран
из TimerTask не может быть вызвана, ругается там на нее.
Подскажите, пожалуйста, как можно обновить экран из TimerTask?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.02.2015, 12:24
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Периодическое обновление ListView (Программирование Android):

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

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

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

Обновление ListView в таймере
Здравствуйте, не могу понять почему listview не обновляется каждую секунду....

Обновление фрагмента с ListView в ViewPager
Есть класс фрагмента, который заполняет адаптер: public class PageFragment...

11
Armagedo
209 / 209 / 60
Регистрация: 22.08.2014
Сообщений: 644
03.02.2015, 13:26 #2
В лоб к "родившей" FragmentActivity не достучаться, похоже.
Нужно либо через Interface, либо через BroadCastReceiver послать в FragmentActivity комманду "обновить"...
0
Spelcrawler
531 / 501 / 113
Регистрация: 12.03.2014
Сообщений: 1,666
Завершенные тесты: 1
03.02.2015, 14:23 #3
Ujin778, ну в принципе для таких задач обычно используют AlarmManager, но он уж больно не стабильный - может сработать позже, может вообще исчезнуть. Но в основном во время работы приложения (когда оно на переднем плане) работает нормально.
0
Ujin778
0 / 0 / 0
Регистрация: 03.02.2015
Сообщений: 5
03.02.2015, 15:07  [ТС] #4
Спасибо за ответ, а можно поподробнее про AlarmManager, потому что насколько я про него погуглил, это что-то наподобие TimerTask, который я использую, т.е. он запускает какую то активность по определенному расписанию, но все равно останется проблема, как из этой активности обновить список.
0
Armagedo
209 / 209 / 60
Регистрация: 22.08.2014
Сообщений: 644
03.02.2015, 15:14 #5
Повторяю последний раз
Нужно либо через Interface, либо через BroadCastReceiver "послать" в FragmentActivity комманду "обновить"...
0
Ujin778
0 / 0 / 0
Регистрация: 03.02.2015
Сообщений: 5
05.02.2015, 12:23  [ТС] #6
Цитата Сообщение от Armagedo Посмотреть сообщение
Повторяю последний раз


Не могли бы Вы, за вознаграждение, сделать эту часть в программе. Исходники я вышлю?
0
Armagedo
209 / 209 / 60
Регистрация: 22.08.2014
Сообщений: 644
05.02.2015, 12:26 #7
Цитата Сообщение от Ujin778 Посмотреть сообщение
Не могли бы Вы, за вознаграждение, сделать эту часть в программе. Исходники я вышлю?
Это "бесплатная" ветка.
Так что выкладывайте сюда.
Даст Бог общо споможем за просто так
0
dtx1212
6 / 6 / 3
Регистрация: 08.12.2013
Сообщений: 26
05.02.2015, 12:30 #8
Используйте EventBus.
0
Ujin778
0 / 0 / 0
Регистрация: 03.02.2015
Сообщений: 5
05.02.2015, 12:36  [ТС] #9
Цитата Сообщение от dtx1212 Посмотреть сообщение
Используйте EventBus.
Там много, проблема в том что я в Андроиде нуб, занимаюсь программированием микроконтроллеров, а тут возникла такая задача, вроде все и получилось, а с периодическим обновлением застопорился, не понимаю я всех нюансов андроида, разбираться буду долго, а надо на сейчас. Может тогда пусть Модератор перенесет тему в предложения работы?
0
Armagedo
209 / 209 / 60
Регистрация: 22.08.2014
Сообщений: 644
05.02.2015, 13:00 #10
Лучший ответ Сообщение было отмечено Ujin778 как решение

Решение

Ну, блин...
За что там деньги брать?
Ты шо тоже за всё подряд берешь?

Короче, в классе активити объяви "наблюдателя".
В его методе onReceive пропиши, что нужно сделать

Для примера
Java
1
2
3
4
5
6
7
8
private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(getBaseContext(), 
            "Got command to update. Updating...",
            Toast.LENGTH_LONG).show();
            refreshListViewData();
        }
В OnCreate активити регистрируй этого демона через
Java
1
2
3
4
5
// Register the observer (mMessageReceiver) to receive Intents
// with actions named "update-listview".
 
LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver,
                      new IntentFilter("update-listview"));
И там, откуда тебе нужно отправь интент через
Java
1
LocalBroadcastManager.getInstance(context).sendBroadcast(new Intent("update-listview"))
Но, поскольку, у голого TimerTask нет возможности добраться до Context (я так понимаю), то свой класс-наследник дополни этим реквизитом и соответствующим конструктором
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class GetPosTask extends TimerTask {
    public static final String TAG = GetPosTask.class.getName();
    private Context context;
 
    GetPosTask(Context _context){
           context = _context;
    } 
 
    @Override
    public void run() {
        GSMGPSSender.getList();//Обновление данных в базе вроде работает
        LocalBroadcastManager.getInstance(context).sendBroadcast(new Intent("update-listview"));
        }
}
Ну и создавай объект c контекстом

Java
1
t.schedule(new GetPosTask(getBaseContext ()), new Date(0), 60000);
Где-то так
2
Ujin778
0 / 0 / 0
Регистрация: 03.02.2015
Сообщений: 5
05.02.2015, 14:00  [ТС] #11
Спасибо большое за помощь!
Распихал все как Вы написали, заработало.
0
Armagedo
209 / 209 / 60
Регистрация: 22.08.2014
Сообщений: 644
05.02.2015, 14:04 #12
Цитата Сообщение от Ujin778 Посмотреть сообщение
Спасибо большое за помощь!
На здоровье
0
05.02.2015, 14:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.02.2015, 14:04
Привет! Вот еще темы с решениями:

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

Обновление ListView при изменении значений в базе SQLite
Доброго времени суток господа. У меня такой вопрос. Как лучше сделать...

Обновление данных ListView при подключении к сети WiFi Android
Написал приложение для получения курса валют с сайта РБК. Все работает кроме...

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


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

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

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