Fragment, BackStack и Recyclerview
Добавлено: 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();
}
}
}
Имеется основная 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();
}
}
}