Fotonick
@Fotonick
android-er (Навальный отменит налоги фрилансерам)

Почему не заполняется ListFragment когда фрагмент вызывается повторно?

Сценарий проблемы
1. Приложение загрузилось. Грузится главный фрагмент (первый пункт бокового меню NavigationDrawer)
MainFragment mainFragment = new MainFragment();
transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.mainContainer, mainFragment, "mainFragment").commit();

в котором есть 4 вкладки с другими фрагментами
public class SectionsPagerAdapter extends FragmentStatePagerAdapter {

        public SectionsPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {

            switch (position) {
                case 0:
                    skidkiFragment = new SkidkiFragment();
                    return skidkiFragment;
                case 1:
                    lotteriesFragment = new LotteriesFragment();
                    return lotteriesFragment;
                case 2:
                    actionsFragment = new ActionsFragment();
                    return actionsFragment;
                case 3:
                    prizesFragment = new PrizesFragment();
                    return prizesFragment;
                default:
                    return null;
            }
        }

        @Override
        public int getCount() {
            return 4;
        }

    }


SkidkiFragment() это ListFragment который нормально заполняется данными от сервера при первом запуске. Также при использовании дополнительного фильтра содержимое этого фрагмента нормально обновляется (то есть два состояния - в одном список из 5 пунктов, в другом более 100).

2. Уходим в другой пункт бокового меню (замена MainFragment на какой-то другой)
3. Возвращаемся на первый экран снова через боковое меню
MainFragment mainFragment = new MainFragment();
transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.mainContainer, mainFragment, "mainFragment").commit();

4. Первая вкладка (SkidkiFragment()) заполняется данными с теми условиями фильтра которые были сохранены при переходе с первого экрана на другой пункт меню.

Проблема - смена условий фильтра теперь не срабатывает на список. Хотя метод загрузки данных корректно получает данные в соответствии со сменой фильтра.

Я так понимаю проблема в назначении адаптера setListAdapter. Похоже что после "возвращения" (пересоздания MainFragment с содержащимся в нём SkidkiFragment()) назначение адаптера срабатывает только один раз при создании (заполнение данных со старыми условиями фильтра). А при обновлении фильтра адаптер уже не может примениться к фрагменту, что очень странно, так как как я уже говорил при первичной загрузке приложения фильтр работает нормально и назначение адаптера не испытвает проблем. Такое только после того как мы ушли на другой экран через пункт меню и потом вернулись обратно.

public class SkidkiFragment extends ListFragment {

....
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        skidkiFragment = inflater.inflate(R.layout.fragment_skidki, null);
...
            GetSkidki();
...    

        return skidkiFragment;
    }


    private void GetSkidki() {

        AllConnectService allConnectService = AllConnectService.retrofit.create(AllConnectService.class);

        Call<ResponseBody> call;

        if (selectID == -1) {
            call = allConnectService.getSkidki("json");
        } else {
            call = allConnectService.getSkidkiByFilter("json", selectID);
        }


        call.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {


                try {

                    if (response.code() == 200) {

                        responseJSON = new JSONArray(response.body().string());


                        getCount = responseJSON.length();

                        allSkidkiList = new ArrayList();

                        ClassOneSkidkaPartner classOneSkidkaPartner;
                        int count = 0;

                        while (count < getCount) {


                            classOneSkidkaPartner = new ClassOneSkidkaPartner(
                                    responseJSON.getJSONObject(count).getInt("id"),
                                    responseJSON.getJSONObject(count).getString("name"),
                                    responseJSON.getJSONObject(count).getString("site"),
                                    responseJSON.getJSONObject(count).getString("vk_site"),
                                    responseJSON.getJSONObject(count).getString("ok_site"),
                                    responseJSON.getJSONObject(count).getString("fb_site"),
                                    responseJSON.getJSONObject(count).getInt("ratio"),
                                    responseJSON.getJSONObject(count).getInt("voice"),
                                    responseJSON.getJSONObject(count).getString("description"),
                                    responseJSON.getJSONObject(count).getString("desc_discount"),
                                    responseJSON.getJSONObject(count).getDouble("discount"),
                                    responseJSON.getJSONObject(count).getDouble("discount_max"),
                                    responseJSON.getJSONObject(count).getString("discount_type"),
                                    responseJSON.getJSONObject(count).getString("logo"),
                                    responseJSON.getJSONObject(count).getInt("IsScore")

                            );

                            if (userLocalStore.getAddBonuses()) {
                                if (classOneSkidkaPartner.getIsScore() == 0) {
                                } else {
                                    allSkidkiList.add(classOneSkidkaPartner);
                                }
                            } else {

                                allSkidkiList.add(classOneSkidkaPartner);
                            }


                            count++;
                        }

                        if (getCount == 0) {

                        } else {

                            adapterOneSkidka = new AdapterOneSkidka(allSkidkiList, getContext());
                            setListAdapter(adapterOneSkidka);
                        }
                    } else {

                        Toast toast = Toast.makeText(getActivity(), response.code() + response.message(), Toast.LENGTH_SHORT);
                        toast.show();
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {

                Toast toast = Toast.makeText(getActivity(), "Ошибка! Не удалось получить данные. Проверьте соединение с интернетом.", Toast.LENGTH_SHORT);
                toast.show();
            }
        });

    }

    @Override
    public void onPrepareOptionsMenu(Menu menu) {
        if (userLocalStore.getAddBonuses()) {
            menu.findItem(R.id.addBonuses).setChecked(true);
        } else {
            menu.findItem(R.id.addBonuses).setChecked(false);
        }
        super.onPrepareOptionsMenu(menu);
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {

        menu.clear();
        inflater.inflate(R.menu.menu_search, menu);
        inflater.inflate(R.menu.filter_bonus, menu);
        super.onCreateOptionsMenu(menu, inflater);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {


            case R.id.addBonuses:
                if (item.isChecked()) {
                    item.setChecked(false);
                    userLocalStore.setAddBonuses(false);
                    GetSkidki();
                } else {
                    item.setChecked(true);
                    userLocalStore.setAddBonuses(true);
                    GetSkidki();
                }

                break;
            default:
                break;
        }

        return true;
    }

}
  • Вопрос задан
  • 154 просмотра
Решения вопроса 1
Fotonick
@Fotonick Автор вопроса
android-er (Навальный отменит налоги фрилансерам)
Оказалось что это вот этот баг https://code.google.com/p/android/issues/detail?id...

нужно было в адаптере ViewPager использовать не getFragmentManager а
mSectionsPagerAdapter = new SectionsPagerAdapter(getChildFragmentManager());
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы