首页 > 解决方案 > 使用 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

它会像我想要的那样显示,但是,这就是问题所在。当我转到另一个片段并返回(通过使用BottomNavigationView)时,onCreateView将再次调用,数据将再次加载。

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


我的问题:

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

是一个类似的问题。


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

选择内部的项目时,BottomNavigationView它会夸大/替换片段,从而onCreateView被调用。我的方法在内部被调用onCreateView,这意味着每次我在片段之间“切换”时,我的方法都会被再次调用,导致 Volley 再次获取数据。

标签: javaandroidandroid-fragmentsandroid-bottomnav

解决方案


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

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

文章来源

一个有用的答案


我认为您的问题与viewPager.

尝试这个:

viewPager.setOffscreenPageLimit(3);

在此示例中,我将3设置为屏幕外页面限制。默认值为1

1表示,您viewPager只从当前页面的左侧创建 1,从右侧创建 1。当您在范围限制中选择片段时,其他将被销毁并重新创建。

例如,我说,您的屏幕外页面限制为 1,而您在 viewPager 中有 5 个页面。开始时,您位于第一页。第 1 和第 2 页已创建,其他页面未创建。如果选择第 3 页,则将重新创建第 4 页,并销毁第 1 页。数字意味着,您只能创建 X 个邻居,其他邻居将被破坏。如果你增加离屏页面限制,你可以让所有的片段都处于活动状态,那么你就不会再有再玩的问题了。

来源链接


推荐阅读