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

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

Войти
Регистрация
Восстановить пароль
 
Ujin778
0 / 0 / 0
Регистрация: 03.02.2015
Сообщений: 5
#1

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

03.02.2015, 12:24. Просмотров 958. Ответов 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);
сделал для начала обновление при нажатии кнопки, работает правильно:
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?
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
03.02.2015, 13:26     Периодическое обновление ListView #2
В лоб к "родившей" FragmentActivity не достучаться, похоже.
Нужно либо через Interface, либо через BroadCastReceiver послать в FragmentActivity комманду "обновить"...
Spelcrawler
525 / 495 / 111
Регистрация: 12.03.2014
Сообщений: 1,647
Завершенные тесты: 1
03.02.2015, 14:23     Периодическое обновление ListView #3
Ujin778, ну в принципе для таких задач обычно используют AlarmManager, но он уж больно не стабильный - может сработать позже, может вообще исчезнуть. Но в основном во время работы приложения (когда оно на переднем плане) работает нормально.
Ujin778
0 / 0 / 0
Регистрация: 03.02.2015
Сообщений: 5
03.02.2015, 15:07  [ТС]     Периодическое обновление ListView #4
Спасибо за ответ, а можно поподробнее про AlarmManager, потому что насколько я про него погуглил, это что-то наподобие TimerTask, который я использую, т.е. он запускает какую то активность по определенному расписанию, но все равно останется проблема, как из этой активности обновить список.
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
03.02.2015, 15:14     Периодическое обновление ListView #5
Повторяю последний раз
Нужно либо через Interface, либо через BroadCastReceiver "послать" в FragmentActivity комманду "обновить"...
Ujin778
0 / 0 / 0
Регистрация: 03.02.2015
Сообщений: 5
05.02.2015, 12:23  [ТС]     Периодическое обновление ListView #6
Цитата Сообщение от Armagedo Посмотреть сообщение
Повторяю последний раз


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

Короче, в классе активити объяви "наблюдателя".
В его методе 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);
Где-то так
Ujin778
0 / 0 / 0
Регистрация: 03.02.2015
Сообщений: 5
05.02.2015, 14:00  [ТС]     Периодическое обновление ListView #11
Спасибо большое за помощь!
Распихал все как Вы написали, заработало.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.02.2015, 14:04     Периодическое обновление ListView
Еще ссылки по теме:

Адаптер и ListView Android
Android Обновление ListView
ListView обновление Android
Android Обновление ListView после добавления записи
Android Обновление listview

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

Или воспользуйтесь поиском по форуму:
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
05.02.2015, 14:04     Периодическое обновление ListView #12
Цитата Сообщение от Ujin778 Посмотреть сообщение
Спасибо большое за помощь!
На здоровье
Yandex
Объявления
05.02.2015, 14:04     Периодическое обновление ListView
Ответ Создать тему
Опции темы

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