TabPageIndicator: не удается обновить представление фрагмента, имеющего ListView, после получения ответа от AsyncTask

Я использую TabPageIndicator (Библиотека здесь). У меня 2 вкладки. Оба показывают один и тот же лабораторный результат по-разному. Одна вкладка группирует результат по дате, а другие группы вкладок по имени соска.

Моя цель - сделать только один вызов на сервере и использовать сгенерированный POJO в обоих фрагментах ViewPager. Я создал кастом FragmentPagerAdapter в котором я инициализирую фрагменты в getItem() следующим образом:

@Override
    public Fragment getItem(int position) {
        Fragment fragment = null;
        switch(position){
            case 0:
                if(labsByDateFragment == null){                     
                    labsByDateFragment = new LabsByDateFragment();
                    fragment = labsByDateFragment;
                }
                break;
            case 1: 
                if(labsByTestFragment == null){                 
                    labsByTestFragment = new LabsByTestFragment();
                    fragment = labsByTestFragment; 
                }
                break;
        }

        return fragment;
    }

И то и другое LabsByDateFragment & LabsByTestFragment продолжается Fragment и имеют ListView, Сейчас изначально когда мой FragmentActivity запускает, он покажет как пустой фрагмент, так и вызывающий AsyncTask сделать вызов веб-службы для данных.

Как только данные получены от AsyncTask, я звоню notifyDataSetChanged(labResponse) в OnCompleteListner следующим образом:

 private OnCompleteListner onCompleteListner = new OnCompleteListner() {

            @Override
            public void onSuccess(Object obj) {

                LabsResponse labResponse = (LabsResponse) obj;
                adapter.notifyDataSetChanged(labResponse);          

            }

            @Override
            public void onFailure(String message) {
                AlertDialog dialog = (AlertDialog) DialogFactory
                        .getDialogWithOkButton(
                                "Oops..Failed to get your Results...Sorry..",
                                ResultsLauncher.this);
                dialog.setOwnerActivity(ResultsLauncher.this);
                dialog.show();
            }
        };



    public void notifyDataSetChanged(LabsResponse labsResponse){

            labsByDateFragment.setLabsResponse(labsResponse);            
            labsByTestFragment.setLabsResponse(labsResponse);            

    }

setLabsResponse в обоих фрагментах просто получить список лабораторий, сгруппированных соответственно (по дате или по имени) и инициализировать мой пользовательский ListView Adapter, И связать адаптер с ListView.

Моя проблема в том, что я получаю ListView Отображается только в 1-м фрагменте. Но 2-й фрагмент остается пустым. Также ListView 1-го Фрагмента (с LabsByDateFragment) показывает данные, сгруппированные по названию теста Lab. Но если я поменяю порядок звонков setLabsResponse в notifyDataSetChanged как следует, он покажет мне результаты, сгруппированные по дате:

public void notifyDataSetChanged(LabsResponse labsResponse){             

        labsByTestFragment.setLabsResponse(labsResponse);            
        labsByDateFragment.setLabsResponse(labsResponse);            

}

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

1 ответ

У меня была похожая проблема, потому что есть несколько запущенных экземпляров класса Activity.

Чтобы разрешить только один экземпляр Activity, мы должны добавить android:launchMode="singleTask" нашей Activity в AndroidManifest.xml

Пример:

<activity android:name="myActivity" android:launchMode="singleTask">