Страница 1 из 1

Fragment, BackStack и Recyclerview

Добавлено: 27 ноя 2016, 20:10
plita
Добрый день! Ищу помощь в решении такой проблемы:

Имеется основная 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();
}
}
}

Re: Fragment, BackStack и Recyclerview

Добавлено: 28 ноя 2016, 05:14
klblk
Проблема скорее всего во фрагменте, код которого вы не показали.

Re: Fragment, BackStack и Recyclerview

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