使用 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,请求并保存数据,如果不是,使用保存的数据填充列表。
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 个邻居,其他的将被摧毁。如果你增加离屏页面限制,那么你可以让所有的片段都处于活动状态,就不会再有娱乐问题困扰你了。
我有一个 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,请求并保存数据,如果不是,使用保存的数据填充列表。
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 个邻居,其他的将被摧毁。如果你增加离屏页面限制,那么你可以让所有的片段都处于活动状态,就不会再有娱乐问题困扰你了。