java - 使用 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 再次获取数据。
解决方案
更新:
如果您在单击 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 个邻居,其他邻居将被破坏。如果你增加离屏页面限制,你可以让所有的片段都处于活动状态,那么你就不会再有再玩的问题了。
推荐阅读
- matlab - 如何索引返回数组(MatLab)的函数调用?
- javascript - 无法从循环中获取值以推送到循环外的数组
- javascript - 为什么我不能在定义 var 时放置 .value 属性?
- c++ - 拓扑排序不打印所有顶点
- python - 如何高效读取大型 XML 文件并创建自定义对象?(Biopython SeqIO)
- python - 是否有 Python 函数可以随机拆分 deepchem.data.NumpyDataset?
- java - 如何在 Java/Android 中将其转换为 Json?
- javascript - JavaScript 试图为 html 做一个时钟,不知道是什么坏了
- php - mysqli 的插入查询似乎不起作用,我不知道为什么
- html - 垂直滚动捕捉部分中的水平滚动捕捉部分,由于 ul 和 div 的缘故,上面有空白空间