Остановить перезагрузку ViewPager при изменении действия - PullRequest
0 голосов
/ 05 мая 2019

В моем приложении есть фрагмент, содержащий ListView.Элементы списка доступны для щелчка мышью, поэтому открывается новое действие и продолжается получение необходимой информации из элемента списка.Когда я возвращаюсь из этого действия к своему Fragment, оно перезагружается, но я бы не хотел снова получать все данные и просто возвращаться к нему.Я заметил, что есть и другие вопросы о том, как предотвратить перезагрузку при изменении Fragment, но я не нашел работающего решения о переходе на другое действие и возврате без принудительной перезагрузки.Есть ли способ предотвратить это и в этом случае?И реализовано ли оно в MainActivity или в конкретном Fragment тогда?

My MainActivity с ViewPager:

public class MainActivity extends AppCompatActivity {
   
    private ViewPager viewPager;
    public BottomNavigationView bottomNavigationView;
    QuestionsFragment questionsFragment;
    GroupsFragment groupsFragment;
    ProfileFragment profileFragment;
    MenuItem prevMenuItem;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        //Initializing viewPager
        viewPager = (ViewPager) findViewById(R.id.viewpager);
        //Initializing the bottomNavigationView
        bottomNavigationView = (BottomNavigationView)findViewById(R.id.bottom_navigation);
        bottomNavigationView.setOnNavigationItemSelectedListener(
                new BottomNavigationView.OnNavigationItemSelectedListener() {
                    @Override
                    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                        switch (item.getItemId()) {
                            case R.id.navigation_questions:
                                viewPager.setCurrentItem(0);
                                break;
                            case R.id.navigation_groups:
                                viewPager.setCurrentItem(1);
                                break;
                            case R.id.navigation_profile:
                                viewPager.setCurrentItem(2);
                                break;
                        }
                        return false;
                    }
                });

        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            }
            @Override
            public void onPageSelected(int position) {
                if (prevMenuItem != null) {
                    prevMenuItem.setChecked(false);
                }
                else
                {
                    bottomNavigationView.getMenu().getItem(0).setChecked(false);
                }
                Log.d("page", "onPageSelected: "+position);
                bottomNavigationView.getMenu().getItem(position).setChecked(true);
                prevMenuItem = bottomNavigationView.getMenu().getItem(position);
            }
            @Override
            public void onPageScrollStateChanged(int state) {
            }
        });
        setupViewPager(viewPager);
    }
    private void setupViewPager(ViewPager viewPager) {
        ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
        questionsFragment = new QuestionsFragment();
        groupsFragment = new GroupsFragment();
        profileFragment = new ProfileFragment();
        adapter.addFragment(questionsFragment);
        adapter.addFragment(groupsFragment);
        adapter.addFragment(profileFragment);
        viewPager.setAdapter(adapter);
        int limit = adapter.getCount();
        viewPager.setOffscreenPageLimit(limit);
    }
}

Фрагментом, к которому я хотел бы вернуться:

public class QuestionsFragment extends Fragment {
    private RecyclerView recyclerView;
    private RecyclerView.Adapter recyclerViewAdapter;
    private RecyclerView.LayoutManager recyclerViewlayoutManager;
    private List<QuestionModel> questionList;
    public QuestionsFragment() {
       
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_questions, container, false);
        
    //fill questionList
    recyclerViewAdapter = new RecyclerViewQuestionAdapter(questionList, getActivity());
    recyclerView.setLayoutManager(recyclerViewlayoutManager);
    recyclerView.setAdapter(recyclerViewAdapter);
        
    return view;
    }
}

1 Ответ

1 голос
/ 05 мая 2019

Привет, ваш ViewPagerAdapter должен быть на FragmentStatePageAdapter больше, чем FragmentPagerAdapter, если нет.

FragmentStatePageAdapter содержит состояния фрагментов при изменениях табуляции и при возврате взад и вперед. Экземпляр фрагмента воссоздается, как только вы возвращаетесь к существующему элементу, и состояние восстанавливается.Этот адаптер подходит для списков с неизвестным количеством или для списков, в которых элементы сильно меняются.

setOffscreenPageLimit () - 3 или 2, так как вы используете как минимум 3 фрагмента.

При использовании FragmentPagerAdapter вы должны обязательно очистить любые ссылки на текущий View или Context в onDestroyView ()

...