Обновить список вкладок из родительской активности

Привет, у меня есть приложение, которое после входа в систему загружает основное действие, содержащее вкладку с 3 вкладками, содержащими списки. Каждая вкладка заполняется через sqlite + пользовательский адаптер. База данных изначально заполняется данными xml (асинхронно синхронизируется с базой данных sqlite).

Моя проблема: я хочу разрешить ручную синхронизацию базы данных sqlite с данными XML, которая затем обновляет текущее представление списка на вкладке. У меня отлично работает асинхронный поток, выполняющий фоновое обновление базы данных. Чего я не могу понять, так это как принудительно обновить список текущей вкладки. Проблема в том, что я не знаю, как получить доступ к вспомогательному действию в tabhost из родительского действия.

Я уверен, что notifyDataSetChanged() - это то, что мне нужно, но я не могу понять, как получить доступ к активности вкладки> адаптеру, чтобы сделать это. Как мне получить доступ к адаптеру вспомогательных действий, чтобы вызвать notifyDataSetChanged()? Родительское (содержащее) действие имеет кнопку, которая будет использоваться для обновления списка вкладок.

Альтернатива: я мог бы попробовать передать намерение из обратного вызова onPostExecute() моего фонового потока. т.е., когда он завершает обновление базы данных данными xml, моя вкладка получает трансляцию и запускает ее для обновления с помощью notifyDataSetChanged()... но, вероятно, это НЕ то, как разработаны намерения трансляции/получения, верно?? т. е. связь между действием и активностью просмотра списка вкладки?

Это мой второй пост о переполнении стека. Надеюсь, я объяснил все понятно. Спасибо за любую помощь или совет, который вы можете предоставить

EDIT (16 января 2012 г.): Прошло много времени с тех пор, как я работал над этой проблемой. Первоначально я использовал решение для трансляции намерения и его использования в дочерней активности. НО с тех пор я последовал совету многих других (и вам следует тоже)! и вместо этого перестал использовать действия внутри вкладок. Теперь я использую представления на вкладках. Это работает НАМНОГО лучше и чище.

Помимо того, что код стал слишком громоздким, я также получал странные ошибки типа «База данных не закрыта» при переходе между действиями, а также при повороте разделения из портретной/пейзажной ориентации. Представления во вкладках вместо действий исправили многие проблемы, и я уверен, что это лучше с точки зрения использования ресурсов.


person wired00    schedule 07.04.2011    source источник
comment
Но как вы обновили представление списка внутри представления вкладок?   -  person Shrikant    schedule 05.11.2012


Ответы (2)


Я только что закончил реализацию «а» решения. Я в основном выбрал вариант широковещательного намерения, о котором я упоминал выше.

Если кто-то еще захочет сделать это таким образом, в методе onPostExecute() моей AsyncTask задача (выполняет фоновую синхронизацию моего XML с базой данных). Я поднимаю Intent Broadcast с помощью:

    @Override
    protected void onPostExecute(Integer result) {
        Intent i = new Intent("com.myapp.app.DATA_REFRESH");
        sendBroadcast(i);

    }       

Затем в активности tabhost> tab я получаю это широковещательное намерение с помощью:

public class updaterBroadcastReceiver extends BroadcastReceiver {       
        @Override
        public void onReceive(Context context, Intent intent) {
            fillData(); // rebuild my listview with new database data
        }
}

Зарегистрируйте / настройте указанный выше приемник намерений с помощью:

@Override
public void onResume(){         
         IntentFilter filter = new IntentFilter("com.myapp.app.DATA_REFRESH");
         updaterBroadcastReceiver r = new updaterBroadcastReceiver();
         registerReceiver(r,filter);

         super.onResume();
}   

FillData() используется для обновления списка новыми данными из базы данных.

Ну, это, кажется, работает для меня, если у кого-то есть предложение о лучшем способе сделать это, пожалуйста, дайте мне знать. Я совсем новичок в андроиде.

Привет, Роб

person wired00    schedule 07.04.2011

Взгляните на эту тему.

У меня была аналогичная проблема, когда я хотел обновить вкладку в событии TabHost. Я определил интерфейс, который реализовал все мои действия Sub(Tab), и вызвал сообщение для действия Sub(Tab) из TabHost (посмотрите на опубликованный метод onTouch()).

person FrVaBe    schedule 07.04.2011
comment
Спасибо, KClaszen, выглядит хорошо, как вы получаете контекст активности вложенной вкладки. Я мог бы попробовать изменить свой, чтобы сделать это таким образом (т.е. View currentView = getTabHost().getCurrentView(); Context currentViewContext = currentView.getContext(); Как вы думаете, есть ли какой-либо недостаток в том, чтобы делать что-то с использованием реализации намерения широковещательной передачи/получения, как у меня, по сравнению с этим? Я бы отметил вас, но недостаточно репутации :) - person wired00; 08.04.2011
comment
@ wired00 К сожалению, я еще не использовал намеренную трансляцию и не могу комментировать это решение. - person FrVaBe; 08.04.2011