使用 BottomNavigationView 时只加载一次数据

Load data only once when using BottomNavigationView

我有一个 BottomNavigationView 显示 Fragments,在我的第一个片段中,我使用 volley 获取 JSON 数据并将其填充到 RecyclerView 中,如下所示:

private void loadRecyclerViewData() {
    StringRequest stringRequest = new StringRequest(Request.Method.GET,
            URL_DATA,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String s) {
                    bar.setVisibility(View.GONE);
                    try {
                        JSONArray array = new JSONArray(s);

                        for (int i = 0; i < array.length(); i++) {
                            JSONObject o = array.getJSONObject(i);
                            ListItem item = new ListItem(
                                    o.getString("name"),
                                    o.getString("bio"),
                                    o.getString("imageurl")
                            );
                            listItems.add(item);
                        }

                        adapter = new MyAdapter(listItems, getContext());
                        rv.setAdapter(adapter);

                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError volleyError) {
            bar.setVisibility(View.GONE);
            Toast.makeText(getContext(), volleyError.getMessage(), Toast.LENGTH_LONG).show();
        }
    });
    RequestQueue requestQueue = Volley.newRequestQueue(getContext());
    requestQueue.add(stringRequest);
}

以上在我的片段中被调用 onCreateView

它按照我想要的方式显示,但是,这就是问题所在。当我转到另一个片段并 return(通过使用 BottomNavigationView)时,将再次调用 onCreateView 并再次加载数据。

一个很好的例子是 YouTube 和 Instagram 应用程序,在视图之间切换时不会每次都重新加载数据。


我的问题:

如何在不调用 onDestroyView 的情况下使用 BottomNavigationView 在片段之间导航,或者是否有其他方法可以避免我遇到的问题?

Here是一个类似的问题。


编辑 1:为问题添加更多上下文

当在 BottomNavigationView 中选择一个项目时,它 inflates/replaces 一个片段,导致 onCreateView 被调用。我的方法在 onCreateView 内被调用,这意味着每次我 "switch" 在片段之间,我的方法将被再次调用导致 Volley 再次获取数据。

更新: 如果您在单击 BottomNavigationView 项时使用替换片段,则替换片段后始终会调用 onCreateView 方法,此方法会根据 Fragment.

的生命周期自动调用

您可以使用Non-Swipeable viewPager作为下面提到的结构,或者您可以尝试使用Bundles中的save instance。你可以设置这样的逻辑:如果你的savedState为null,请求并保存数据,如果不是,使用保存的数据填充列表。

Source of Article

A Useful answer


我认为您的问题与 viewPager 有关。

试试这个:

viewPager.setOffscreenPageLimit(3);

在这个例子中,我将3设置为离屏页面限制。默认值为 1.

1 表示,您的 viewPager 仅从当前页面的左侧创建 1 个,从右侧创建 1 个。当您 select 在范围限制内碎片时,其他人将被销毁并重新创建。

比如我说你的offscreen page limit是1,你在viewPager中有5个页面。一开始,您位于第一页。第一页和第二页已创建,其他页面未创建。如果您 select 第 3 页,第 4 页将被重新创建,第 1 页将被销毁。这个数字意味着,你只能创建 X 个邻居,其他的将被摧毁。如果你增加离屏页面限制,那么你可以让所有的片段都处于活动状态,就不会再有娱乐问题困扰你了。

Source Link