Android智能下拉刷新框架 — SmartRefreshLayout
SmartRefreshLayout стремится создать мощный, стабильный и зрелый фреймворк для обновления данных с помощью прокрутки вниз. Он интегрирует различные впечатляющие, разнообразные, практичные и красивые Header и Footer.
Как следует из названия, SmartRefreshLayout — это «умный» или «интеллектуальный» механизм обновления. Благодаря своей «умности», он не только поддерживает все виды View, но и многоуровневые вложенные структуры представлений.
Он наследуется от ViewGroup, а не от FrameLayout или LinearLayout, что повышает производительность. Также он включает в себя преимущества популярных механизмов обновления, таких как SwipeRefreshLayout от Google, Ultra-Pull-To-Refresh и TwinklingRefreshLayout. Кроме того, он интегрирует множество впечатляющих Header и Footer.
Особенности и функции:
Для получения дополнительной информации посетите следующие ресурсы:
Также доступны демонстрационные APK и примеры использования фреймворка в реальных приложениях. |FlyRefresh| |[https://github.com/race604/FlyRefresh]|
|ClassicsHeader|#1|
Phoenix | Taurus |
---|---|
![]() |
![]() |
Yalantis/Phoenix | Yalantis/Taurus |
BattleCity | HitBlock |
---|---|
![]() |
![]() |
FunGame/BattleCity | FunGame/HitBlock |
WaveSwipe | Material |
---|---|
![]() |
![]() |
WaveSwipeRefreshLayout | MaterialHeader |
StoreHouse | WaterDrop |
---|---|
![]() |
![]() |
CRefreshLayout | WaterDrop |
Увидев так много великолепных Headers, разве вы не думаете, что это здорово? В этот момент вы можете беспокоиться о том, что так много Headers объединены вместе, но в действительности вы будете использовать только один из них, и вам придётся включать много ненужного кода и ресурсов? В версии V2.x зависимости библиотек были разделены на 8 пакетов, которые можно использовать по мере необходимости!
V1.1.0 Если вы используете версию 1.x, пожалуйста, переключитесь, текущая версия 2.0 была переработана и не поддерживает обновление, рекомендуется использовать её в новых проектах.
Версия 2.x относительно версии 1.x изменила имена пакетов, например, com.scwang.smartrefresh был изменён на com.scwang.smart.refresh. Рекомендуется использовать его в новом проекте, если проект обновляется, java и xml должны быть заменены именами пакетов, что довольно хлопотно. Однако основное изменение заключается в разделении Smart на пакеты, уменьшении ненужных зависимостей, таких как отсутствие необходимости в использовании двухуровневого обновления, чтобы избежать избыточности кода. Тем не менее, SmartRefreshHeader не был разделён на пакеты, и в нём есть более десяти Headers, поэтому рекомендуется скопировать исходный код нужного Header в проект. Конечно, вы также можете обсудить и проголосовать за выбор наиболее часто используемых Headers в разделе обсуждения, а затем разделить их отдельно.
compile 'com.android.support:appcompat-v7:25.3.1' //обязательно 25.3.1 или выше
// Обратите внимание: после разделения пакетов не будет автоматически добавляться ни один из стандартных Headers или Footers, всё ещё используются три метода!
implementation 'com.scwang.smart:refresh-layout-kernel:2.0.1' //обязательная зависимость ядра
implementation 'com.scwang.smart:refresh-header-classics:2.0.1' //классический Header обновления
implementation 'com.scwang.smart:refresh-header-radar:2.0.1' //Header обновления типа «радар»
implementation 'com.scwang.smart:refresh-header-falsify:2.0.1' //виртуальный Header обновления
implementation 'com.scwang.smart:refresh-header-material:2.0.1' //Header обновления Google
implementation 'com.scwang.smart:refresh-header-two-level:2.0.1' //двухуровневый Header обновления
implementation 'com.scwang.smart:refresh-footer-ball:2.0.1' //шаровой импульс Footer загрузки
implementation 'com.scwang.smart:refresh-footer-classics:2.0.1' //классический Footer загрузки
Если вы используете AndroidX, сначала добавьте две строки в gradle.properties. Нельзя пропустить ни одну из строк!
android.useAndroidX=true
android.enableJetifier=true
Вам нужно зависеть от androidx.appcompat
implementation 'androidx.appcompat:appcompat:1.0.0' //обязательно 1.0.0 или выше
implementation 'com.scwang.smart:refresh-layout-kernel:2.0.1' //обязательная зависимость ядра
implementation 'com.scwang.smart:refresh-header-classics:2.0.1' //классический Header обновления
implementation 'com.scwang.smart:refresh-header-radar:2.0.1' //Header обновления типа «радар»
implementation 'com.scwang.smart:refresh-header-falsify:2.0.1' //виртуальный Header обновления
implementation 'com.scwang.smart:refresh-header-material:2.0.1' //Header обновления Google
implementation 'com.scwang.smart:refresh-header-two-level:2.0.1' //двухуровневый Header обновления
implementation 'com.scwang.smart:refresh-footer-ball:2.0.1' //шаровой импульс Footer загрузки
implementation 'com.scwang.smart:refresh-footer-classics:2.0.1' //классический Footer загрузки
#### 2. Добавьте SmartRefreshLayout в XML-файл макета
```xml
<?xml version="1.0" encoding="utf-8"?>
<com.scwang.smart.refresh.layout.SmartRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/refreshLayout">
``` ```
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.scwang.smart.refresh.header.ClassicsHeader
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:overScrollMode="never"
android:background="#fff" />
<com.scwang.smart.refresh.footer.ClassicsFooter
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</com.scwang.smart.refresh.layout.SmartRefreshLayout>
RefreshLayout refreshLayout = (RefreshLayout)findViewById(R.id.refreshLayout);
refreshLayout.setRefreshHeader(new ClassicsHeader(this));
refreshLayout.setRefreshFooter(new ClassicsFooter(this));
refreshLayout.setOnRefreshListener(new OnRefreshListener() {
@Override
public void onRefresh(RefreshLayout refreshlayout) {
refreshlayout.finishRefresh(2000/*,false*/);//передаём false, чтобы указать на неудачное обновление
}
});
refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() {
@Override
public void onLoadMore(RefreshLayout refreshlayout) {
refreshlayout.finishLoadMore(2000/*,false*/);//передаём false, чтобы указать на неудачную загрузку
}
});
public class App extends Application {
//статический код может предотвратить утечку памяти
static {
//устанавливаем глобального создателя Header
SmartRefreshLayout.setDefaultRefreshHeaderCreator(new DefaultRefreshHeaderCreator() {
@Override
public RefreshHeader createRefreshHeader(Context context, RefreshLayout layout) {
layout.setPrimaryColorsId(R.color.colorPrimary, android.R.color.white);//глобально устанавливаем основную тему цвета
return new ClassicsHeader(context);//.setTimeFormat(new DynamicTimeFormat("обновлено %s"));//указываем классический Header, по умолчанию это Header в стиле радара Безиера
}
});
//устанавливаем глобального создателя Footer
SmartRefreshLayout.setDefaultRefreshFooterCreator(new DefaultRefreshFooterCreator() {
@Override
public RefreshFooter createRefreshFooter(Context context, RefreshLayout layout) {
//указываем классический Footer, по умолчанию это BallPulseFooter
return new ClassicsFooter(context).setDrawableSize(20);
}
});
}
}
Обратите внимание: Header и Footer, установленные методом один, имеют самый низкий приоритет, и если также используются методы два и три, они будут заменены.
<com.scwang.smart.refresh.layout.SmartRefreshLayout
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/refreshLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#444444"
app:srlPrimaryColor="#444444"
app:srlAccentColor="@android:color/white"
app:srlEnablePreviewInEditMode="true">
<!--srlAccentColor srlPrimaryColor изменит основную тему цветов Header и Footer-->
<!--srlEnablePreviewInEditMode можно включить и выключить функцию предварительного просмотра-->
<com.scwang.smart.refresh.header.ClassicsHeader
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="@dimen/dimenPaddingCommon"
android:background="@android:color/white"
android:text="@string/description_define_in_xml"/>
<com.scwang.smart.refresh.footer.ClassicsFooter
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</com.scwang.smart.refresh.layout.SmartRefreshLayout>
Обратите внимание: Header и Footer, настроенные методом два, имеют средний приоритет и могут быть заменены методом три. Кроме того, при использовании этого метода Android Studio будет иметь эффект предварительного просмотра, как показано на рисунке ниже:
Однако не беспокойтесь, это просто эффект предварительного просмотра, который появится только после того, как вы потянете вниз.
final RefreshLayout refreshLayout = (RefreshLayout) findViewById(R.id.refreshLayout);
//устанавливаем Header в виде радара Безиера
refreshLayout.setRefreshHeader(new BezierRadarHeader(this).setEnableHorizontalDrag(true));
//устанавливаем Footer в виде шарового импульса
refreshLayout.setRefreshFooter(new BallPulseFooter(this).setDrawableSize(15));
``` **BallPulseFooter(this).setSpinnerStyle(SpinnerStyle.Scale));**
4. 更多使用说明
- [Свойства документа](https://github.com/scwang90/SmartRefreshLayout/blob/master/art/md_property.md)
- [Частые вопросы](https://github.com/scwang90/SmartRefreshLayout/blob/master/art/md_faq.md)
- [Пользовательский заголовок](https://github.com/scwang90/SmartRefreshLayout/blob/master/art/md_custom.md)
**Спуфинг**
SmartRefreshLayout не требует добавления спуфинг-фильтров, и уже прошёл тестирование на спуфинг, если у вас возникли проблемы при использовании в проекте после спуфинга, пожалуйста, сообщите мне об этом вовремя.
**Пожертвования**
Если вам нравится дизайн SmartRefreshLayout и вы считаете, что SmartRefreshLayout помог вам, вы можете поддержать его, нажав «Star» в правом верхнем углу. Спасибо! ^_^
Вы также можете отсканировать следующий QR-код: ~ Пожалуйста, поддержите автора чашкой кофе.
> Если вы хотите получить дополнительную помощь после пожертвования, вы можете присоединиться к платной группе вместо обычного пожертвования. Платная группа может напрямую получать непосредственную помощь автора и обратную связь по вопросам.
Если вы оставите комментарий с именем в пожертвовании, он будет записан в список. Если вы также являетесь автором открытого исходного кода GitHub, вы можете оставить адрес проекта или личную домашнюю страницу в пожертвовании. Ссылка будет добавлена в список для взаимного продвижения.
[Список пожертвований](https://github.com/scwang90/SmartRefreshLayout/blob/master/art/md_donationlist.md)
**Дружественные ссылки**
[github/Loror](https://github.com/Loror)
[github/faith-hb/WidgetCase](https://github.com/faith-hb/WidgetCase)
[github/Bamboy120315/Freedom](https://github.com/Bamboy120315/Freedom)
[github/TommyLemon/APIJSON](https://github.com/TommyLemon/APIJSON)
[github/dengyuhan](https://github.com/dengyuhan)
[github/zrp2017](https://github.com/zrp2017)
[github/fly803/BaseProject](https://github.com/fly803/BaseProject)
[github/razerdp](https://github.com/razerdp)
[github/SuperChenC/s-mvp](https://github.com/SuperChenC/s-mvp)
[github/KingJA/LoadSir](https://github.com/KingJA/LoadSir)
[github/jianshijiuyou](https://github.com/jianshijiuyou)
[github/zxy198717](https://github.com/zxy198717)
[github/addappcn](https://github.com/addappcn)
[github/RainliFu](https://github.com/RainliFu)
[github/sugarya](https://github.com/sugarya)
[github/stormzhang](https://github.com/stormzhang)
Обсуждение
----------
QQ решение группы — 602537182 (платное)
**Вступление в группу**
С момента создания группы многие друзья подняли много вопросов, и я решил многие из них. Большинство проблем были вызваны ошибками в этой библиотеке, а некоторые были связаны с окружающей средой самого проекта пользователя. Это заняло у меня много времени. После моего наблюдения и тестирования, ошибки в этой библиотеке становятся всё реже и реже. Конечно, нельзя сказать, что их нет совсем, но они могут удовлетворить потребности большинства проектов. Поэтому с этого момента я принял решение превратить предыдущую дискуссионную группу в платную группу для решения проблем, возникающих при использовании этой библиотеки, будь то ошибка в самой библиотеке или особая среда проекта (включая ошибку самого проекта).
У меня также есть своя работа и время для отдыха. Только когда вы понимаете и поддерживаете меня, я могу сосредоточиться на решении ваших проблем. Однако, чтобы не беспокоиться, я создал ещё одну бесплатную дискуссионную группу QQ.
QQ дискуссионная группа — 914275312 (новая) 477963933 (полная) 538979188 (полная)
**Вступление в группу**
Эта группа бесплатна для вступления, и все могут обсуждать использование и возникающие проблемы, связанные с этой библиотекой. Лидер группы также решит проблему в группе. Если проблема не может быть решена членами группы, лидер группы не решит эту проблему. Если проект является срочным, пожалуйста, войдите в платную группу решений (обратите внимание, что в платной группе лидер группы будет очень серьёзно и усердно решать проблемы, но это не гарантирует, что она может быть полностью решена), или переключитесь на использование других библиотек обновления.
<!-- Эта группа предназначена только для обсуждения Android Smart Refresh Layout. Пожалуйста, не обсуждайте контент, кроме Android и обновления вниз. В этой группе позже будет взиматься плата за решение группы, и бесплатная дискуссионная группа будет открыта снова. Те, кто ещё не присоединился к группе, должны поторопиться~ -->
**Напоминание**
Ответ на присоединение к группе можно найти в этом документе.
Другие работы
-------------
[MultiWaveHeader](https://github.com/scwang90/MultiWaveHeader)
[SmartRefreshHorizontal](https://github.com/scwang90/SmartRefreshHorizontal)
[Поэзия и Даль](http://android.myapp.com/myapp/detail.htm?apkName=com.poetry.kernel)
Спасибо
--------
[SwipeRefreshLayout](https://developer.android.com/reference/android/support/v4/widget/SwipeRefreshLayout.html)
[Ultra-Pull-To-Refresh](https://github.com/liaohuqiu/android-Ultra-Pull-to-Refresh)
[TwinklingRefreshLayout](https://github.com/lcodecorex/TwinklingRefreshLayout)
[BeautifulRefreshLayout](https://github.com/android-cjj/BeautifulRefreshLayout)
Лицензия
-------
Copyright 2017 scwang90
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )