我有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再次获取数据。
答案 0 :(得分:1)
<强>更新强>
如果在单击BottomNavigationView项时使用替换片段,则在替换片段后将始终调用onCreateView方法,此方法将根据Fragment
的生命周期自动调用。
您可以使用Non-Swipeable viewPager作为下面提到的结构,或者您可以尝试在Bundles中使用save instance。您可以设置如下逻辑:如果您的savedState为null,请发出请求并保存数据,如果不是,请使用保存的数据填充列表。
我认为您的问题与viewPager
有关。
试试这个:
viewPager.setOffscreenPageLimit(3);
在此示例中,我将 3 设置为屏幕外页面限制。默认值为 1 。
值 1 表示,您的viewPager
仅从左侧创建1,从当前页面右侧创建1。当您在范围限制中选择片段时,其他将被销毁并重新创建。
例如,我说,您的屏幕外页面限制为1,并且您在viewPager中有5页。一开始,您就在第一页。创建第1页和第2页,其他页面不创建。如果选择第3页,将重新创建第4页,第1页将被销毁。数字意味着,您只能创建X个邻居,其他人将被销毁。如果您增加屏幕外页面限制,您可以激活所有片段,那么就不会有令您烦恼的娱乐问题。