Загружать данные только один раз при использовании BottomNavigationView - PullRequest
0 голосов
/ 28 апреля 2018

У меня есть BottomNavigationView с отображением Fragments, в моем первом фрагменте я использую залп для выборки данных 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, это означает, что каждый раз, когда я «переключаюсь» между фрагментами, мой метод вызывается снова, и Волей снова получает данные.

1 Ответ

0 голосов
/ 28 апреля 2018

UPDATE: Если вы используете фрагменты замены при щелчке элементов BottomNavigationView, метод onCreateView всегда будет вызываться после замены фрагмента, этот метод вызывается автоматически в соответствии с жизненным циклом Fragment.

Вы можете использовать Non-Swipeable viewPager в качестве структуры, упомянутой ниже, или вы можете попробовать использовать экземпляр сохранения в Bundles. Вы можете настроить логику следующим образом: если ваш saveState имеет значение null, сделайте запрос и сохраните данные, если нет, используйте сохраненные данные для заполнения списка.

Источник статьи

Полезный ответ


Я думаю, что ваша проблема связана с viewPager.

Попробуйте это:

viewPager.setOffscreenPageLimit(3);

В этом примере я устанавливаю 3 в качестве ограничения экрана за пределами экрана. Значением по умолчанию является 1 .

Значение 1 означает, что viewPager создает только 1 с левой стороны, 1 с правой стороны текущей страницы. Другие будут уничтожены и воссозданы при выборе фрагмента в пределах диапазона.

Например, я говорю, что ваш предел закадровых страниц равен 1, и у вас есть 5 страниц в viewPager. В начале вы находитесь на первой странице. 1-я и 2-я страницы созданы, другие нет. Если вы выберете 3-ю страницу, 4-я страница будет воссоздана, а 1-я будет уничтожена. Число означает, что у вас есть только X чисел, соседи могут быть созданы, другие будут уничтожены. Если вы увеличите лимит закадровых страниц, то сможете активировать все фрагменты, и тогда не возникнет проблем с отдыхом.

Ссылка на источник

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...