CoolRefreshView
Поддержка обновления любого View.
Поддержка пользовательского Header.
Поддержка событий распределения NestedScrollingParent и NestedScrollingChild.
Вложенные ViewPager не конфликтуют друг с другом.
Способ импорта:
Gradle: compile 'com.shizhefei:CoolRefreshView:1.0.1' Поскольку используются v4 и recyclerview, их также необходимо импортировать: compile 'com.android.support:support-v4:23.4.0'
Jar-пакет: Download sample Apk
Информация о версии и обновлениях: https://github.com/LuckyJayce/CoolRefreshView/releases
XML:
<com.shizhefei.view.coolrefreshview.CoolRefreshView android:layout_width="match_parent" android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</com.shizhefei.view.coolrefreshview.CoolRefreshView>
Код:
coolRefreshView.setPullHeader(new MaterialHeader(getContext())); // Добавление прослушивателя обновления coolRefreshView.addOnPullListener(new SimpleOnPullListener() { @Override public void onRefreshing(CoolRefreshView refreshView) {
}
});
Установка глобального IPullHeaderFactory
// Статическая установка глобального IPullHeaderFactory, настройка один раз, все по умолчанию используют этот factory для создания PullHeader // Не нужно настраивать каждый интерфейс, этот код можно поместить в Application onCreate
CoolRefreshView.setPullHeaderFactory(new IPullHeaderFactory() { @Override public PullHeader made(Context context) { JellyHeader jellyHeader = new JellyHeader(getContext()); jellyHeader.setDragLayoutColor(ContextCompat.getColor(getContext(), R.color.primary)); jellyHeader.setLoadingView(R.layout.layout_jelley_header); return jellyHeader; }
@Override
public boolean isPinContent() {
return false;
}
});
Настройка ContentView, чтобы он двигался вместе с заголовком или оставался на месте
/**
Пользовательский Header
Реализация PullHeader:
public class TestHeader implements PullHeader { private View headView; private TextView mTextView;
@Override
public View createHeaderView(final CoolRefreshView refreshView) {
headView = LayoutInflater.from(refreshView.getContext()).inflate(R.layout.coolrecyclerview_testhead, refreshView, false);
mTextView = (TextView) headView.findViewById(R.id.coolrecyclerview_testhead_text1_textView);
return headView;
}
/**
* Начало перетаскивания
*/
@Override
public void onPullBegin(CoolRefreshView refreshView) {
isDownArrow = true;
}
/**
* Изменение положения
*
* @param refreshView
* @param status Состояние / Нет операции
* public final static byte PULL_STATUS_INIT = 1;
* // Начало перетаскивания
* public final static byte PULL_STATUS_TOUCH_MOVE = 2;
* // Возврат к исходному положению
* public final static byte PULL_STATUS_RESET = 3;
* // Обновление
* public final static byte PULL_STATUS_REFRESHING = 4;
* // Завершение обновления
* public final static byte PULL_STATUS_COMPLETE = 5;
* @param dy Смещение события перетаскивания
* @param currentDistance Текущее расстояние смещения
*/
@Override
public void onPositionChange(CoolRefreshView refreshView, int status, int dy, int currentDistance) {
int offsetToRefresh = getConfig().offsetToRefresh(refreshView, headView);
if (status == CoolRefreshView.PULL_STATUS_TOUCH_MOVE) {
if (currentDistance < offsetToRefresh) {
if (!isDownArrow) {
mTextView.setText("Обновление при перетаскивании");
... **isDownArrow = true;**
}
} else {
if (isDownArrow) {
mTextView.setText("Освободить для немедленного обновления");
isDownArrow = false;
}
}
}
}
private boolean isDownArrow;
/**
* Обновление выполняется
*/
@Override
public void onRefreshing(CoolRefreshView refreshView) {
mTextView.setText("Обновление...");
}
/**
* Нет обновления, чтобы вернуться назад
*/
@Override
public void onReset(CoolRefreshView refreshView, boolean pullRelease) {
}
/**
* Установка обновления завершена и возврат назад
*/
@Override
public void onPullRefreshComplete(CoolRefreshView frame) {
}
@Override
public Config getConfig() {
return config;
}
//Использование конфигурации по умолчанию
private DefaultConfig config = new DefaultConfig();
}
Также можно напрямую наследовать от View и реализовать PullHeader
public class TestHeader extends View implements PullHeader {
@Override
public View createHeaderView(final CoolRefreshView refreshView) {
return this;
}
}
##<2>Конфигурация расстояния, позволяющая реализовать более богатые эффекты
abstract class Config {
/**
* Если палец отпущен за пределами этого смещения, будет инициировано обновление.
*/
public abstract int offsetToRefresh(CoolRefreshView refreshView, View headerView);
/**
* Смещение положения отображения обновления во время загрузки.
*/
public abstract int offsetToKeepHeaderWhileLoading(CoolRefreshView refreshView, View headerView);
/**
* Общее расстояние, на которое можно перетащить вниз элемент управления обновлением.
*/
public abstract int totalDistance(CoolRefreshView refreshView, View headerView);
/**
* Смещение headerView в макете.
*/
public abstract int headerViewLayoutOffset(CoolRefreshView refreshView, View headerView);
/**
* Можно ли прокручивать contentView вверх, используется для определения, следует ли выполнять действие обновления при прокрутке вниз. Если contentView можно прокручивать вверх, то действие обновления не выполняется.
*/
public abstract boolean contentCanScrollUp(CoolRefreshView refreshView, View contentView);
/**
* Перехват события скольжения.
*
* @param refreshView
* @param dy Смещение скольжения пальца.
* @param currentDistance Текущее расстояние скольжения.
* @param totalDistance Расстояние, на которое можно скользить.
* @return
*/
public abstract int dispatchTouchMove(CoolRefreshView refreshView, int dy, int currentDistance, int totalDistance);
}
Конфигурация по умолчанию
//Общее расстояние скольжения равно высоте header, умноженной на 3.
//Расстояние скольжения для запуска обновления составляет 1,2 высоты header.
//Высота header во время обновления.
class DefaultConfig extends Config {
@Override
public int offsetToRefresh(CoolRefreshView refreshView, View headerView) {
return (int) (headerView.getMeasuredHeight() * 1.2f);
}
@Override
public int offsetToKeepHeaderWhileLoading(CoolRefreshView refreshView, View headerView) {
return headerView.getMeasuredHeight();
}
@Override
public int totalDistance(CoolRefreshView refreshView, View headerView) {
return headerView.getMeasuredHeight() * 3;
}
.....
}
Вторая распространённая конфигурация
//Общая область скольжения равна высоте header.
//Область обновления занимает 1/3 часть снизу header.
//Расстояние скольжения до запуска обновления составляет 1,2 от расстояния обновления.
private DefaultConfig config = new DefaultConfig() {
@Override
public int offsetToRefresh(CoolRefreshView refreshView, View headerView) {
return (int) (headerView.getMeasuredHeight() / 3 * 1.2f);
}
@Override
public int offsetToKeepHeaderWhileLoading(CoolRefreshView refreshView, View headerView) {
return headerView.getMeasuredHeight() / 3;
}
@Override
public int totalDistance(CoolRefreshView refreshView, View headerView) {
return headerView.getMeasuredHeight();
}
};
##В сочетании с библиотекой MVCHelper, при скольжении вверх загружается больше данных
В сочетании
https://github.com/LuckyJayce/MVCHelper
Код всего из 5 строк, можно реализовать обновление при скольжении вниз, автоматическую загрузку дополнительных данных при прокрутке к нижней части экрана, разбиение на страницы, автоматическое переключение отображения макета при сбое сети или отсутствии данных. CoolRefreshView coolRefreshView = (CoolRefreshView) findViewById(R.id.coolRefreshView);
MVCHelper<List> mvcHelper = new MVCCoolHelper<List>(coolRefreshView);
// 设置数据源 mvcHelper.setDataSource(new BooksDataSource()); // 设置适配тор mvcHelper.setAdapter(new BooksAdapter(this));
// 加载 данных mvcHelper.refresh();
Подробнее смотрите в демо на https://github.com/LuckyJayce/MVCHelper.
Обработка событий скольжения основана на SwipeRefreshLayout из пакета v4, что позволяет поддерживать события распределения NestedScrollingParent и NestedScrollingChild и избегать конфликтов событий вложенных ViewPager.
Структура основана на структуре проекта https://github.com/liaohuqiu/android-Ultra-Pull-To-Refresh, которая имеет хорошую структуру и позволяет пользователям настраивать Header по своему усмотрению.
В реализации Header используется два подхода:
1.https://github.com/LuckyJayce/ViewPagerIndicator — Indicator заменяет tabhost и реализует эффекты верхней вкладки от NetEase, нижней вкладки от Sina Weibo, страницы руководства, бесконечного баннера и т. д., а также позволяет настраивать высоту вкладок и эффекты.
2.https://github.com/LuckyJayce/MVCHelper — реализует функции обновления при вытягивании, прокрутки до конца для автоматической загрузки дополнительных данных, разбивки на страницы, автоматического переключения отображения макета при сбое сети, макета «нет данных» и поддерживает произвольные виды и переключение основных фреймворков обновления.
3.https://github.com/LuckyJayce/MultiTypeView — упрощает адаптер RecyclerView для различных типов, позволяя динамически добавлять фрагменты в RecyclerView и реализовывать сложные интерфейсы с несколькими модулями разработки.
4.https://github.com/LuckyJayce/EventBus — шина событий, использующая динамические прокси-интерфейсы для публикации и получения событий. Определяет интерфейс для отправки событий зарегистрированным и реализующим его классам.
5.https://github.com/LuckyJayce/LargeImage — загрузка больших изображений, полезная для изучения.
6.https://github.com/LuckyJayce/GuideHelper — страница руководства для новичков, позволяющая легко реализовать отображение подсказок и демонстрацию функций на соответствующем представлении.
7.https://github.com/LuckyJayce/HVScrollView — двунаправленный ScrollView, поддерживающий вложенные ScrollViews для многоуровневой прокрутки и позволяющий устанавливать направления прокрутки.
8.https://github.com/LuckyJayce/CoolRefreshView — RefreshView с функцией вытягивания, поддерживающая обновление произвольных видов, настраиваемый Header, поддержку NestedScrollingParent, NestedScrollingChild для распределения событий и отсутствие конфликтов событий во вложенных ViewPagers.
С этими библиотеками вы сможете достичь новых высот в разработке!
Проект ViewPagerIndicator_Demo представляет собой пример кода. После просмотра этого примера вы удивитесь, обнаружив, что все вкладки на самом деле реализованы через viewpager, без использования tabhost, а все формы вкладок реализованы с помощью Indicator. Проект ViewPagerIndicator_Library является библиотекой классов.
Если у вас есть какие-либо предложения, вы можете отправить их на мою электронную почту 794629068@qq.com.
/*
http://www.apache.org/licenses/LICENSE-2.0
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )