Сценарий проблемы
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;
}
}