Fragment, BackStack и Recyclerview

Activity Lifecycle, Saving Activity State, Managing Tasks, Intent, Intent Filter
Ответить
plita
Сообщения: 2
Зарегистрирован: 27 ноя 2016, 20:04

Fragment, BackStack и Recyclerview

Сообщение plita » 27 ноя 2016, 20:10

Добрый день! Ищу помощь в решении такой проблемы:

Имеется основная Activity с NavigationDrawer, в которую загружаются разные фрагменты.
Необходимо реализовать возврат на предыдущий фрагмент по кнопке Назад.

Использую для этого popBackStack, все работает, но при возвращении на фрагменты, содержащие RecyclerView, все элементы внутри него начинают дублироваться, например:

При первом открытии фрагмента имеем список:

Позиция 1
Позиция 2
Позиция 3

При возврате на этот фрагмент через BackStack:

Позиция 1
Позиция 2
Позиция 3
Позиция 1
Позиция 2
Позиция 3


Код Drawer'a для переключения фрагментов:

public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here.
android.app.FragmentManager fm=getFragmentManager();
fm.popBackStack(null, fm.POP_BACK_STACK_INCLUSIVE);
int id = item.getItemId();

if (id == R.id.menu_userpage) {
fm.beginTransaction().replace(R.id.content_frame,new UserFragment()).addToBackStack("UserFragment").commit();
setTitle("Моя страница");
} else if (id == R.id.menu_grouplist_all) {
Bundle arguments = new Bundle();
arguments.putString("for_user","0");
Fragment newFragment=new GroupListFragment();
newFragment.setArguments(arguments);
fm.beginTransaction().replace(R.id.content_frame,newFragment).addToBackStack("GroupListFragment").commit();
setTitle("Группы");
} else if (id == R.id.menu_task_all) {
Fragment newFragment=new TaskListAllFragment();
fm.beginTransaction().replace(R.id.content_frame,newFragment).addToBackStack("TaskListFragment").commit();
setTitle("Задания");
}
}

Код BackStack

public void onBackPressed() {
//super.onBackPressed();
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
} else {
android.app.FragmentManager fm=getFragmentManager();
int backstack_count=fm.getBackStackEntryCount();
if (backstack_count>1) {
fm.popBackStack();
backstack_count--;
} else {
fm.beginTransaction().replace(R.id.content_frame,new UserFragment()).addToBackStack("UserFragment").commit();
}
}
}

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: Fragment, BackStack и Recyclerview

Сообщение klblk » 28 ноя 2016, 05:14

Проблема скорее всего во фрагменте, код которого вы не показали.

plita
Сообщения: 2
Зарегистрирован: 27 ноя 2016, 20:04

Re: Fragment, BackStack и Recyclerview

Сообщение plita » 29 ноя 2016, 16:27

Уже разобрался, необходимо было перед добавлением элементов в ArrayList, который находится внутри RecyclerView проверять их количество и добавлять новые, если count(ArrayList)=0.
Почему-то при возврате назад фрагмент не очищает список, загруженный при предыдущем открытии этого фрагмента.

Ответить