【问题标题】:Stop ViewPager from reloading when Activity changedActivity 更改时停止 ViewPager 重新加载
【发布时间】:2019-05-05 16:17:03
【问题描述】:

在我的应用程序中,我有一个包含ListView 的片段。列表中的项目是可点击的,因此会打开一个新活动并继续使用列表项中的必要信息。当我从该活动返回到我的Fragment 时,它会重新加载,但我不想再次获取整个数据而只是恢复它。 我注意到还有其他关于如何在更改Fragment 时防止重新加载的问题,但是我没有找到一个可行的解决方案来改变到另一个活动并在不强制重新加载的情况下返回。在这种情况下也有办法防止它吗?那么它是在MainActivity 还是特定的Fragment 中实现的呢?

我的 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;
    }
}

【问题讨论】:

  • 我觉得Android ViewModel可以帮到你

标签: android android-fragments android-recyclerview fragment


【解决方案1】:

嗨,如果不是,您的 ViewPagerAdapter 必须比 FragmentStatePageAdapter 扩展 FragmentPagerAdapter

FragmentStatePageAdapter 保存选项卡更改以及您来回切换时的片段状态。 一旦您返回到现有项目并恢复状态,就会重新创建 Fragment 实例。此适配器适用于计数未知的列表或项目变化很大的列表。

setOffscreenPageLimit() 到 3 或 2 as u r 至少使用 3 个片段。

使用 FragmentPagerAdapter 时,您必须确保清除任何 onDestroyView() 中对当前视图或上下文的引用

【讨论】:

  • 除了我应该更改扩展名之外,您能否提供更多指示?除了将其更改为FragmentStatePagerAdapter,还需要做什么?
  • 我猜这个问题是由于寻呼机适配器造成的。因此最好更改您的寻呼机适配器父类并将相关设置添加到您的视图寻呼机适配器。由于 FragmentPager 和 FragmentStatePager 共享相似的编码行为,因此不会有更多的编码更改。
  • 好的,但不幸的是,仅更改扩展名并没有解决问题
猜你喜欢
  • 2012-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-06
  • 2019-06-22
  • 1970-01-01
相关资源
最近更新 更多