@TigrIT

Как с начала загрузить список, а затем его обновлять с помощью SwipeRefreshLayout?

Нужно чтобы загружался с начала список, а за тем его обновлять с помощью SwipeRefreshLayout.
У меня получається что то одно.
Или загружаеться список но потом он не обновляеться (хотя перезагрузка происходит).
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list);

        ListView list_block = findViewById(R.id.list_block);
        TextView contentView = findViewById(R.id.topText);

        mSwipeRefreshLayout = findViewById(R.id.swipe_refresh);

        ...код загрузки списка...

        mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                    mSwipeRefreshLayout.setRefreshing(false);
            }
        });
    }
}

Или список обновляється но тогда нет загрузке при старте програмы. Что не очень красиво когда загрузил програму и смотриш на пустой екран.
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list);

        ListView list_block = findViewById(R.id.list_block);
        TextView contentView = findViewById(R.id.topText);

        mSwipeRefreshLayout = findViewById(R.id.swipe_refresh);

        mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {

                    ...код загрузки списка...

                    mSwipeRefreshLayout.setRefreshing(false);
            }
        });
    }
}


У меня только получилось если написато (...код загрузки списка...) два раза один снаружи SwipeRefreshLayout и один внутри повторить его еще раз. Я так понимаю по другому не получиться.
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list);

        ListView list_block = findViewById(R.id.list_block);
        TextView contentView = findViewById(R.id.topText);

        mSwipeRefreshLayout = findViewById(R.id.swipe_refresh);

        ...код загрузки списка...

        mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {

                    ...код загрузки списка...

                    mSwipeRefreshLayout.setRefreshing(false);
            }
        });
    }
}
  • Вопрос задан
  • 54 просмотра
Решения вопроса 1
@AlexVWill
Второй случай явно неправильный, т.к. всетаки сначала должен загружаться список, а потом он должнен по свайпу обновляться. Поэтому ты ничего и не видишь, т.к. формирование списка происходит не вначале, а после срабатывания листенера setOnRefreshListener на элементе mSwipeRefreshLayout.
Почему не работает вывод списка в первом случае - х.з., т.к. код ты скрыл (что за дурацкая привычка?), а телепаты все разъехались на Бали прочищать свои чакры.
Но если там какой то RecyclerViever, то это работает приблизительно как то так:
spoiler

RecyclerView historyRecyclerView = binding.adrecyclerView;
        historyRecyclerView = historyRecyclerView.findViewById(R.id.adrecycler_view);
        HistoryViewRecycler historyView = new HistoryViewRecycler();
        historyView.initRecycler(historyRecyclerView);

        swipeRefreshLayout = binding.swipeRefreshLayout.findViewById(R.id.swipeRefreshLayout);
        swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                //make new recycle view on swipe refresh
                RecyclerView newhistoryRecyclerView = binding.adrecyclerView;
                HistoryViewRecycler newhistoryView = new HistoryViewRecycler();
                JSONArray newhistory = new HistoryViewRecycler().updateHistory(getContext());
                if (newhistory == null) {
                    new History().getFullHistory(getContext());
                    //Snackbar.make(getActivity().findViewById(android.R.id.content), R.string.auth_error, 3000).setDuration(5000).show();
                }
                newhistoryView.initRecycler(newhistoryRecyclerView);
                swipeRefreshLayout.setRefreshing(false);
            }
        });


Не претендую на исключительность кода, это просто для примера.
У тебя же в коде onRefresh() никакого обновления списка нет, кроме остановки кручения индикатора... ну и с какого перепугу он должен что-то там обновлять?
Размести тогда уж код формирования списка в обоих разделах (как бы 1+2 пример совмести) и посмотри что получится.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
zagayevskiy
@zagayevskiy Куратор тега Java
Android developer at Yandex
Вынеси код загрузки данных в отдельный метод, и вызови его в двух местах(при создании активити и внутри метода onRefresh)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы