使用BottomNavigationView时仅加载一次数据

时间:2018-04-28 07:10:17

标签: java android android-fragments android-bottomnav

我有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在片段之间导航,还是有其他方法可以避免我遇到的问题?

Here是一个类似的问题。

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

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

1 个答案:

答案 0 :(得分:1)

<强>更新 如果在单击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。当您在范围限制中选择片段时,其他将被销毁并重新创建。

例如,我说,您的屏幕外页面限制为1,并且您在viewPager中有5页。一开始,您就在第一页。创建第1页和第2页,其他页面不创建。如果选择第3页,将重新创建第4页,第1页将被销毁。数字意味着,您只能创建X个邻居,其他人将被销毁。如果您增加屏幕外页面限制,您可以激活所有片段,那么就不会有令您烦恼的娱乐问题。

Source Link