Refresh layout android studio

SwipeRefreshLayout

В марте 2014 года был представлен новый компонент android.support.v4.widget.SwipeRefreshLayout, который входил в состав библиотеки Support Library v4. Сейчас это отдельная библиотека в составе AndroidX.

Компонент позволяет отказаться от сторонних библиотек и собственных велосипедов для реализации шаблона «Pull to Refresh», когда пользователь сдвигает экран, чтобы обновить данные. Подобное поведение можно увидеть в клиентах для Твиттера, чтобы получить новую порцию твитов, не дожидаясь, когда список сообщений обновится самостоятельно.

Пример на Kotlin

В марте 2020 года обзавелась стабильной версией.

В методах setColorSchemeColors() или setColorSchemeResources() следует указать используемые цвета.

Компонент достаточно интересный с занимательной анимацией. Вначале анимация представляла собой цветные полоски под заголовком программы. Позже анимацию заменили в стиле Material Design, теперь это маленький кружочек, внутри которого крутятся цветные линии (или чёрная линия, если не использовать метод setColorSchemeResources() со цветами).

Запустите пример и потяните экран сверх вниз, чтобы увидеть эффект обновления данных.

Устаревший пример для Java

Обернём компоненты родительским элементом SwipeRefreshLayout. На панели инструментов данного компонента нет, поэтому придётся писать код вручную.

В примере реализуется интерфейс OnRefreshListener с методом onRefresh(), в котором следует обновить поступающие данные. В нашем случае просто генерируются случайные числа.

При первом появлении библиотеки использовался метод setColorScheme(), который объявлен устаревшим. Вместо него появились два новых метода setColorSchemeColors() и setColorSchemeResources(). Принцип остался тот же, вам нужно указать четыре цвета по константам Color.XXX или из ресурсов. Вы можете не использовать вызов метода с цветными линиями, тогда будет выводиться только чёрная линия по умолчанию.

Компонент достаточно интересный с занимательной анимацией. Вначале анимация представляла собой цветные полоски под заголовком программы, как представлено на видео.

Позже анимацию заменили в стиле Material Design, теперь это маленький кружочек, внутри которого крутятся цветные линии (или чёрная линия, если не использовать метод setColorSchemeResources() со цветами).

Обновляем список

По такому же принципу обновляем данные в списке.

При каждой попытке обновить список будет добавляться текущая дата и время.

Не забывайте, что обновление может занимать длительное время и использовать сеть для получения данных. Поэтому следует позаботиться о выполнении в другом потоке.

Источник

Refresh layout android studio

С появлением Android 5 Lollipop и Material Design, в функционале Android программирования появилось много интересных вещей, одну из которых мы сегодня рассмотрим и научимся использовать. Речь идет о такой штуке, как Swipe Refresh Layout. Использование этого вида layout дает возможность обновлять страницы приложения с помощью жеста пальца вниз от верха экрана. Если вы пользуетесь мобильной версией браузера Chrome, то видели эту функцию, которая, кстати, введена совсем недавно, около месяца тому назад:

Красивая и полезная вещь, а что еще более интересно — не сложная в использовании и доступна даже на старых версиях Android, на Froyo точно (проверено). И так, начинаем просвещаться.

Читайте также:  Android thread memory leak

Создаем новый проект, выбираем Blank Activity. Открываем файл activity_main.xml и добавляем туда специальный layout по имени SwipeRefreshLayout для реализации обновления жестом:

Элемент ScrollView создан для того, чтобы можно было свайпнуть страницу, без него ничего не выходит (это конкретно в нашем случае, а не везде).

Если не вторгаться в настройки цвета значка обновления, по умолчанию он будет черно-белым. Но мы сделаем свой кружок. Для этого в папке res/values создаем файл по имени colors.xml и добавим туда несколько цветов:

Теперь переходим в MainActivity.java и начинаем писать код. Для реализации такой функции обновления жестом, нашему activity необходимо выполнять специальный интерфейс SwipeRefreshLayout. OnRefreshListener.

Особо то и объяснять нечего, объявили и инициализировали элемент SwipeRefreshLayout, задали выполнение интерфейса .OnRefreshListener, настроили для крутящейся полоски цвета, используя созданные нами с файле colors.xml. Если их не использовать то, как упоминалось выше, анимация будет черно-белой.

Создаем метод onRefresh (), в нем мы указываем на конечность нашего процесса обновления (.setRefreshing (false) ) и задаем длину процесса обновления в 5000 миллисекунд, то есть в 5 секунд. Можете поэкспериментировать и добавить больше цветов и большее время длительности анимации обновления, сколько вам хочется.

Запускаем свое творение и смотрим на результат:

Получилось, согласитесь довольно прикольная фишка :). Как нибудь позже разберемся с более сложными примерами использования Swipe Refresh Layout.

Источник

Урок 19. Работа с SwipeRefreshLayout. Отображение загрузки при запросах

Давайте ещё раз внимательно взглянем на наше приложение. Особенно на прокрутку списка твитов. Очень странно выглядит, что наш верхний блок с информацией о пользователе всегда остаётся на месте, закрывая при этом основную часть экрана. Давайте исправим это.

Вот как выглядит прокрутка списка сейчас:

Для того чтобы это исправить, будем использовать контейнер NestedScrollView , т.к. мы хотим чтобы наш верхний блок также прокручивался, чтобы не занимать рабочую область экрана. Давайте изменим наш activity_user_info.xml .

Видим, что мы просто обернули всю нашу информацию в два новых контейнера: NestedSrollView и LinearLayout . Мы могли бы использовать только NestedScrollView , но у него есть одно ограничение: он должен содержать только один вложенный элемент. Именно поэтому нам пришлось обернуть всю нашу информацию в LinearlLayout . Всё это необходимо сделать, чтобы весь наш экран прокручивался вниз, а не только список твитов. Теперь наш экран выглядит так, как нужно:

Осталось пару нюансов:

  • наш список прокручивается не плавно сейчас.
  • мы забыли добавить разделители между элементами списка.

Чтобы список прокручивался плавно, нам нужно запретить его внутреннее прокручивание, т.к. NestedScrollView берёт на себя эту функцию. Для этого можем использовать метод ViewCompat.setNestedScrollingEnabled(tweetsRecyclerView, false); .

Для того чтобы добавить разделители между элементами списка, необходимо добавить к RecyclerView стандартный ItemDecoration . Именно так и осуществляется добавление разделителей в список. Выглядит вызов так: tweetsRecyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));

После добавления этих изменений код выглядит так:

Видим, что разделители между элементами действительно добавились, и список начал прокручиваться плавно:

Работа с SwipeRefreshLayout.

В этом уроке мы познакомимся с новым элементом SwipeRefreshLayout . Он очень часто используется во многих приложениях для обновления данных на экране. Выглядит виджет следующим образом:

Добавить этот элемент очень просто. Самым главным условием является то, что он должен содержать один элемент внутри себя, который можно прокручивать. Такими элементами являются списки RecyclerView , ListView , элементы, контейнерами которых являются NestedScrollView , ScrollView и так далее.

Читайте также:  Андроид после обновления тупит

Добавление SwipeRefreshLayout к NestedScrollView.

Давайте перейдём к нашему activity_user_info и добавим SwipeRefreshLayout в качестве родителя для нашего NestedScrollView . Выглядит это так:

Давайте добавим наш виджет в UserInfoActivity и добавим к нему логику выполнения метода loadUserInfo(userId) , loadTweets(userId) при обновлении. Важно, что мы должны вызвать tweetAdapter.clearItems(); , чтобы наши данные не дублировались после запроса.

Представьте, что вы зашли на экран и загрузили список из 10 твитов. Потом делаете swipe движение и загружаете те же самые 10 твитов. Если вы не удалите элементы перед выполнением запроса, то они будут дублироваться.

Код добавления SwipeRefreshLayout выглядит так:

Также мы сделали нашу переменную userId final . Это необходимо, чтобы использовать её внутри Callback объектов.

Так, мы увидели наш индикатор обновления. Но у нас осталась одна проблема: индикатор не пропал после того, как наш запрос выполнился.

Отображение, скрытие элемента SwipeRefreshLayout

Нам надо скрывать элемент после того, как операция загрузки данных выполнилась. Для этого мы можем изменить наш код внутри методов loadUserInfo(long userId) и loadTweets(long userId) .

Давайте добавим строку swipeRefreshLayout.setRefreshing(true); в метод onPreExecute . Это необходимо, чтобы когда мы зашли на экран в первый раз, мы увидели состояние загрузки.

Также добавим вызов swipeRefreshLayout.setRefreshing(false); в наш метод onPostExecute() , чтобы прятать наш виджет после завершения запроса.

Запустим приложение и увидим, что данные обновились и индикатор спрятался после обновления.

Мы добавили использование нашего swipeRefreshLayout в метод onPreExecute для отображения состояния загрузки. Также мы используем элемент в методе onPostExecute для того чтобы скрыть наш элемент.

Полный листинг кода:

  • Мы исправили наш интерфейс. После этого наш экран стал выглядеть намного лучше.
  • Мы познакомились с элементом SwipeRefreshLayout . Увидели, что он прост в добавлении и использовании. Предоставляет пользователям удобную возможность обновления информации на экране.

Источник

Новый SwipeRefreshLayout из библиотеки Android support — «потяните чтобы обновить»

Тихо и незаметно вместе с обновлением библиотеки Android support до версии 19.1 в нее прокрался новый компонент, который часто бывает нужным и полезным в быту. Сей совсем крохотный росчерк я посвящаю ему, SwipeRefreshLayout.

Он добавляет функционал, который один мой коллега называет «резинка от трусов», а остальные знают этот UI-паттерн под названием «потяни, чтобы обновить». Он бывает нужен, когда есть какой-то контент, который пользователь хочет часто обновлять, и может это сделать, просто потянув контент жестом вниз, а потом отпустив.

Очень похоже, что компонент был создан для GoogleNow, а потом перекочевал в support lib (очень похожа анимация).

Алгоритм простой.

  1. Компонент «оборачивается» вокруг View или Layout, для которого нужно сделать обновление и может содержать только одного потомка (похоже на ScrollView).
  2. Устанавливается OnRefreshListener с одним единственным методом onRefresh(). Как на него реагировать — решаем сами.
  3. Когда нужно показать, что идет обновление (и запустить анимацию), вызываем метод setRefreshing(boolean) и передаем ему true. Наиболее логичным кажется вызов метода внутри onRefresh().
  4. Когда обновление закончено, вызываем метод setRefreshing(boolean) и передаем ему false.

Давайте попробуем набросать пример использования.
Наш XML (если нужно, можно и динамически создать компонент и добавить в него потомка, компонент наследуется от ViewGroup).

Теперь наша Activity, а именно метод onCreate:

В данном случае я сделал нашу Activity реализующей интерфейс OnRefreshListener

Обратите внимание на метод setColorScheme, он как раз и раскрашивает в разные цвета прогресс во время обновления. В видео ниже видно, о чем я говорю. Первый цвет из 4-х — цвет прогресса во время оттягивания контента вниз перед обновлением. Остальные — сменяющиеся цвета прогресса.

Читайте также:  Android studio imagebutton изменить картинку

А теперь сам onRefresh();

UPD:
Для желающих добавил саму APK
Ссылка на APK в виде кода, чтобы было жить легче:

Источник

Swiperefreshlayout

Latest Update Current Stable Release Next Release Candidate Beta Release Alpha Release
July 22, 2020 1.1.0 1.2.0-alpha01

Declaring dependencies

To add a dependency on SwipeRefreshLayout, you must add the Google Maven repository to your project. Read Google’s Maven repository for more information.

Add the dependencies for the artifacts you need in the build.gradle file for your app or module:

Groovy

Kotlin

For more information about dependencies, see Add build dependencies.

Feedback

Your feedback helps make Jetpack better. Let us know if you discover new issues or have ideas for improving this library. Please take a look at the existing issues in this library before you create a new one. You can add your vote to an existing issue by clicking the star button.

See the Issue Tracker documentation for more information.

Version 1.2.0

Version 1.2.0-alpha01

androidx.swiperefreshlayout:swiperefreshlayout:1.2.0-alpha01 is released. Version 1.2.0-alpha01 contains these commits.

Bug Fixes

  • requestDisallowInterceptTouchEvent(boolean) now honors the request like any other ViewGroup. While strongly discouraged, new behavior can be disabled with setLegacyRequestDisallowInterceptTouchEventEnabled . (I968da, b/141855018)

Version 1.1.0

Version 1.1.0

androidx.swiperefreshlayout:swiperefreshlayout:1.1.0 is released. Version 1.1.0 contains these commits.

Major changes since 1.0.0

  • SwipeRefreshLayout now implements NestedScrollingChild3 and NestedScrollingParent3 .

Version 1.1.0-rc01

androidx.swiperefreshlayout:swiperefreshlayout:1.1.0-rc01 is released with no changes since 1.1.0-beta01 . Version 1.1.0-rc01 contains these commits.

Version 1.1.0-beta01

androidx.swiperefreshlayout:swiperefreshlayout:1.1.0-beta01 is released with no changes since 1.1.0-alpha03 . Version 1.1.0-beta01 contains these commits.

Version 1.1.0-alpha03

androidx.swiperefreshlayout:swiperefreshlayout:1.1.0-alpha03 is released. Version 1.1.0-alpha03 contains these commits.

New features

  • We have a new style attribute R.styleable.SwipeRefreshLayout_swipeRefreshLayoutProgressSpinnerBackgroundColor to set the background color of the progress indicator. (aosp/931124)

API changes

  • requestDisallowInterceptTouchEvent(boolean) now always propagates up to its parents. While strongly discouraged, new behavior can be disabled with setLegacyRequestDisallowInterceptTouchEventEnabled . (aosp/1108540)

Bug fixes

  • Fixed issue with nested scrolling where SwipeRefreshLayout has a scrollable parent (e.g. ViewPager2) and a scrollable child. (b/138314213)

Version 1.1.0-alpha02

androidx.swiperefreshlayout:swiperefreshlayout:1.1.0-alpha02 is released. The commits included in this version can be found here.

Bug fixes

  • Implemented saving and restoring of the refreshing state of SwipeRefreshLayout
  • Fixed usability bug when SwipeRefreshLayout is embedded in a RecyclerView

Version 1.1.0-alpha01

December 3, 2018

API changes

  • aosp/737631: SwipeRefreshLayout now implements NestedScrollingChild3 and NestedScrollingParent3 , enabling nested scrolling 3 parents and children to pass consumed nested scrolling distance information through SwipeRefreshLayout . If developer code currently overrides SwipeRefreshLayout.onNestedScroll(View, int, int, int, int, int) , it will likely no longer be called and SwipeRefreshLayout.onNestedScroll(View, int, int, int, int, int, int[]) should be overridden instead. Likewise, SwipeRefreshLayout.dispatchNestedScroll(int, int, int, int, int[], int) will likely no longer be called and SwipeRefreshLayout.dispatchNestedScroll(int, int, int, int, int[], int, int[]) should be overridden instead.

Content and code samples on this page are subject to the licenses described in the Content License. Java is a registered trademark of Oracle and/or its affiliates.

Источник

Оцените статью