当前位置: 首页 > 知识库问答 >
问题:

防止碎片每次加载数据在bottomnavigation选项卡上单击

祁霖
2023-03-14

我使用有5个选项卡的BottomNavigationView。最初,我加载第一个标签一旦应用程序启动。当我单击任何其他选项卡时,就会调用API并加载数据。现在,当我再次单击上一个选项卡(在启动时加载)时,API调用将再次加载相同的数据。

public class MainActivity extends AppCompatActivity implements NavigationBarView.OnItemSelectedListener {

    private BottomNavigationView bottomNavigationView;
    public static ViewPager2 viewPager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        viewPager = findViewById(R.id.viewpager);
        bottomNavigationView = findViewById(R.id.navigation);

        bottomNavigationView.setOnItemSelectedListener(this);

        getTabs();
    }

    public void getTabs() {

        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentAdapterMain adapter = new FragmentAdapterMain(fragmentManager, getLifecycle());
        viewPager.setAdapter(adapter);

        viewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
            @Override
            public void onPageSelected(int position) {
                super.onPageSelected(position);
                switch (position) {
                    case 0:
                        bottomNavigationView.getMenu().findItem(R.id.one).setChecked(true);
                        break;
                    case 1:
                        bottomNavigationView.getMenu().findItem(R.id.two).setChecked(true);
                        break;
                    case 2:
                        bottomNavigationView.getMenu().findItem(R.id.three).setChecked(true);
                        break;
                    case 3:
                        bottomNavigationView.getMenu().findItem(R.id.four).setChecked(true);
                        break;
                    case 4:
                        bottomNavigationView.getMenu().findItem(R.id.five).setChecked(true);
                        break;
                }
            }
        });

    }

    @SuppressLint("NonConstantResourceId")
    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {

        switch (item.getItemId()) {
            case R.id.one:
                viewPager.setCurrentItem(0, false);
                break;
            case R.id.two:
                viewPager.setCurrentItem(1, false);
                break;
            case R.id.three:
                viewPager.setCurrentItem(2, false);
                break;
            case R.id.four:
                viewPager.setCurrentItem(3, false);
                break;
            case R.id.five:
                viewPager.setCurrentItem(4, false);
                break;
        }
        return true;
    }
}

共有1个答案

东郭弘方
2023-03-14

这可能是一个比您希望的更复杂的解决方案,但是将数据从UI中解耦将是一个可行的方法。意思是使用类似MVVM的东西,然后只保留ViewModel数据(而不是人为地保留片段)

另一个更容易/更快的解决方案是只使用一个存储库,并将加载的数据保存在该类中,然后片段可以检查存储库是否已经加载了数据,然后相应地显示内容。

 类似资料:
  • 我在android中使用BottomNavigationView来制作一个像Instagram一样的应用程序。我在NavigationTabs中使用片段。应用程序有5个标签初始我已经设置为活动标签的中间标签和加载它一旦应用程序启动。当我单击任何其他选项卡时,就会进行网络调用并加载数据。现在,当我按下on back按钮或再次单击last选项卡(在启动时加载)时,片段将被重新创建,并进行网络调用以加载

  • 我已经创建了一个应用程序的布局有三个标签在Android2.3。每个选项卡都有一个片段,在每个片段中,都有一个列表视图。在列表视图中显示的所有数据都来自互联网,数据总是在变化,所以每次我看那个片段的时候都想重新加载数据。例如,我现在正在观看“tab1”,当我单击“tab2”时,“tab2”中的数据将重新加载,而当我单击返回“tab1”时,“tab1”中的数据也将再次重新加载。我试过了 TabSAd

  • 我已经在我的片段中重写了以下方法:setUserVisibleHint 在fragment类中,变量设置为:private var isLoadOnce=false。 我有3个片段,问题是当我的活动popsup时,第一个片段是可见的,如果我单击最后一个选项卡,也就是第三个选项卡加载第三个片段,什么也不会发生,即web服务根本不会调用。

  • 我在我的项目中使用并以片段形式显示数据。这是一个很棒的图书馆,工作很棒。每个片段都由一个学者的讲座组成,这些讲座是从web服务加载的。访问web服务的代码位于片段的方法中。目前,所有片段的数据在添加到时同时加载。我想知道是否只有当用户单击/滑动到特定的选项卡时才能加载片段的数据。不是一次什么都做。 当前的代码是相当标准的,我从提供的示例[android解决方案]中获得了帮助。1 为了确保Fragm

  • 我们使用的是片段,我们不需要在重新创建活动时自动恢复它们。但是,Android每次调用->时,都会恢复片段,即使我们对这些片段使用setRetaInstance(false)。 附言。我们知道,在为配置更改重新创建活动的情况下,可以通过在manifest中添加来完成。但是,在自动清理内存的情况下,如何重新创建活动呢?