1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/luckyjayce-CoolRefreshView

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

CoolRefreshView

  1. Поддержка обновления любого View.

  2. Поддержка пользовательского Header.

  3. Поддержка событий распределения NestedScrollingParent и NestedScrollingChild.

  4. Вложенные ViewPager не конфликтуют друг с другом.

  5. Способ импорта:

    • Gradle: compile 'com.shizhefei:CoolRefreshView:1.0.1' Поскольку используются v4 и recyclerview, их также необходимо импортировать: compile 'com.android.support:support-v4:23.4.0'

    • Jar-пакет: Download sample Apk

  6. Информация о версии и обновлениях: https://github.com/LuckyJayce/CoolRefreshView/releases

Эффект изображения

image

Способ использования

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, чтобы он двигался вместе с заголовком или оставался на месте

/**

  • @param pullHeader Заголовок обновления
  • @param isPinContent true — содержимое не перемещается, только заголовок, false — перемещается вместе */ setPullHeader(PullHeader pullHeader, boolean isPinContent)

Пользовательский Header

<1> Простая реализация

Реализация 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. При фиксированном содержании без вытягивания используется ViewCompat.offsetTopAndBottom(mHeaderView, -deltaY).
  2. При совместном вытягивании Header и содержимого используется метод scrollTo для совместного перемещения.

Основные библиотеки

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.

Контакты и предложения

  • Weibo: http://weibo.com/u/3181073384
  • QQ группа: для общения и решения вопросов об использовании открытых проектов: 549284336

License

/*

  • Copyright (C) 2016 LuckyJayce
  • Copyright (C) 2016 liaohuqiu
  • Copyright (C) 2013 The Android Open Source Project
  • 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 )

Вы можете оставить комментарий после Вход в систему

Введение

Библиотека Android RefreshView поддерживает обновление всех видов, настраиваемый заголовок обновления, реализует NestedScrollingParent и NestedScrollingChild. Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/luckyjayce-CoolRefreshView.git
git@api.gitlife.ru:oschina-mirror/luckyjayce-CoolRefreshView.git
oschina-mirror
luckyjayce-CoolRefreshView
luckyjayce-CoolRefreshView
master