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

OSCHINA-MIRROR/yangchong-YCRefreshView

Клонировать/Скачать
README.md 32 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 27.11.2024 21:02 55d1446

Каталог

  1. Библиотека сложных страниц: введение.

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

  2. Преимущества библиотеки: основные моменты.

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

  3. Использование библиотеки: руководство.

    Основы использования: базовые шаги по интеграции библиотеки в проект и настройке основных параметров.
    Настройка событий обновления: добавление обработчиков событий для обновления данных (например, при прокрутке вверх или вниз).
    Установка заголовков и нижних колонтитулов: настройка отображения заголовков и нижних колонтитулов.
    Управление данными и обновление: управление данными в списке и их обновление.
    Настройка адаптера: настройка адаптера для работы с данными.
    Обработка событий кликов на элементах списка: настройка обработчиков кликов на элементах списка.
    Удаление элементов при боковом пролистывании: реализация функции удаления элементов при боковом пролистывании списка.
    Лёгкое перетаскивание и пролистывание: настройка лёгкого перетаскивания и пролистывания элементов списка.

  4. О переключении состояний: информация.

    Структура содержимого: описание структуры содержимого при переключении между различными состояниями представления.
    Реализация логики переключения: объяснение логики реализации переключения между состояниями.
    Вызов API для переключения состояний: информация о вызове API для управления состояниями.
    Пользовательские макеты состояний: возможности настройки пользовательских макетов для различных состояний.
    Обработка интерактивных событий: обработка интерактивных событий при переключении состояний.

  5. Часто используемые API: обзор.

    Методы переключения состояний: описание методов для переключения между различными состояниями.
    Методы ViewHolder: методы класса ViewHolder для работы с элементами списка.
    Методы адаптера: методы адаптера для управления данными.
    Разделительные линии: методы для добавления разделительных линий в список.
    Пролистывание при боковом движении: методы для реализации пролистывания при боковом движении.
    Прочие API: дополнительные API, предоставляемые библиотекой.

  6. Документация RecyclerView: обновление.

    Идеи для упаковки библиотеки: общие идеи и подходы к упаковке библиотеки.
    Логика оптимизации обработки: оптимизация логики обработки данных в библиотеке.
    Классы, связанные с RecyclerView: классы, связанные с использованием RecyclerView в библиотеке.
    Конфликты при пролистывании RecyclerView: проблемы с конфликтами при пролистывании в RecyclerView.
    Механизм кэширования RecyclerView: механизм кэширования данных в RecyclerView.
    Ссылки на блоги (25 статей): ссылки на статьи и блоги, посвящённые использованию RecyclerView.

  7. Демонстрация эффектов: примеры.

    Обновление при прокрутке вниз и загрузка новых данных при прокрутке вверх: демонстрация эффекта обновления данных при прокрутке вниз и загрузки новых данных при прокрутке вверх.
    Добавление заголовков и нижних колонтитулов: пример добавления пользовательских заголовков и нижних колонтитулов в интерфейс.
    Боковое пролистывание списка: демонстрация горизонтального пролистывания списка элементов.
    Вставка заголовков: пример вставки заголовков в список элементов.
    Совместное использование с CoordinatorLayout: интеграция с CoordinatorLayout для создания более сложных эффектов.
    Эффект каскадного потока: демонстрация каскадного потока элементов в списке.

  8. Обновления версий: информация о последних изменениях.

  9. Справочные материалы: список источников и ресурсов.

  10. Дополнительная информация: прочие сведения о библиотеке. Добавление выпадающей функции обновления и функции загрузки дополнительных данных

3.2. Добавление выпадающей функции обновления и функции загрузки дополнительных данных:

  • Выпадающая функция обновления:

    // Установка слушателя обновления
    recyclerView.setRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {
            // Обновление операции
        }
    });
    // Установка состояния обновления
    recyclerView.setRefreshing(false);
    // Установка цвета обновления
    recyclerView.setRefreshingColorResources(R.color.colorAccent);
  • Функция загрузки дополнительных данных после прокрутки вверх:

    • Первый случай: автоматическая загрузка следующей страницы данных после прокрутки вверх.
    // Настройка макета при прокрутке вверх и прослушивание событий
    adapter.setMore(R.layout.view_more, new OnLoadMoreListener() {
        @Override
        public void onLoadMore() {
            // Можно выполнить запрос на следующую страницу
        }
    });
    • Второй случай: ручная активация загрузки следующей страницы данных после прокрутки вверх.
    adapter.setMore(R.layout.view_more2, new OnMoreListener() {
        @Override
        public void onMoreShow() {
            // Не выполнять обработку
        }
    
        @Override
        public void onMoreClick() {
            // Нажать, чтобы активировать загрузку следующей страницы данных
        }
    });

Добавление заголовка и нижнего колонтитула

3.3. Добавление заголовка и нижнего колонтитула:

  • Добавление обычного макета (не ListView или RecyclerView):
    adapter.addHeader(new InterItemView() {
        @Override
        public View onCreateView(ViewGroup parent) {
            View inflate = LayoutInflater.from(context).inflate(R.layout.header_view, null);
            return inflate;
        }
    
        @Override
        public void onBindView(View headerView) {
            TextView tvTitle = headerView.findViewById(R.id.tvTitle);
        }
    });
  • Добавление макета списка (например, горизонтального RecyclerView):
    adapter.addHeader(new InterItemView() {
        @Override
        public View onCreateView(ViewGroup parent) {
            RecyclerView recyclerView = new RecyclerView(parent.getContext()){
                // Чтобы не мешать горизонтальной прокрутке RecyclerView, можно обработать следующим образом
                @SuppressLint("ClickableViewAccessibility")
                @Override
                public boolean onTouchEvent(MotionEvent event) {
                    super.onTouchEvent(event);
                    return true;
                }
            };
            return recyclerView;
        }
    
        @Override
        public void onBindView(View headerView) {
            // Здесь необходимо обработать
            ((ViewGroup)headerView).requestDisallowInterceptTouchEvent(true);
        }
    });

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

Установка данных и обновление

3.4. Установка данных и обновление:

  • Добавить все данные, которые могут быть коллекцией или массивом:
    // Добавить все данные
    adapter.addAll(data);
    // Добавить отдельные данные
    adapter.add(data);
  • Вставить, обновить и удалить данные:
    // Вставить данные по указанному индексу, отдельные данные
    adapter.insert(data, pos);
    // Вставить данные по указанному индексу, несколько данных
    adapter.insertAll(data, pos);
    // Обновить данные по указанному индексу
    adapter.update(data, pos);
    // Удалить данные, указанные данные
    adapter.remove(data);
    // Удалить данные по указанному индексу
    adapter.remove(pos);
    // Очистить все данные

Настройка адаптера

3.5. Настройка адаптера:

При создании пользовательского адаптера необходимо реализовать RecyclerArrayAdapter, где T — это тип данных bean, который вы хотите использовать. BaseViewHolder

private TextView tv_title;
private ImageView iv_news_image;

PersonViewHolder(ViewGroup parent) {
    super(parent, R.layout.item_news);
    iv_news_image = getView(R.id.iv_news_image);
    tv_title = getView(R.id.tv_title);

    //Добавление дочерних элементов по клику
    addOnClickListener(R.id.iv_news_image);
    addOnClickListener(R.id.tv_title);
}

@Override
public void setData(final PersonData person){
    Log.i("ViewHolder","position"+getDataPosition());
    tv_title.setText(person.getName());
}

}

3.6 Настройка событий кликов для элементов списка

События кликов для элементов списка:

  • Событие клика для элемента списка:

    adapter.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(int position) { if (adapter.getAllData().size()>position && position>=0){ //Обработка логики события клика } } });*

  • События кликов для дочерних элементов:

    //Добавление событий кликов для дочерних элементов, см. раздел 3.5 Настройка адаптера addOnClickListener(R.id.iv_news_image); addOnClickListener(R.id.tv_title);

    //Настройка событий кликов для дочерних элементов adapter.setOnItemChildClickListener(new OnItemChildClickListener() { @Override public void onItemChildClick(View view, int position) { switch (view.getId()){ case R.id.iv_news_image: Toast.makeText(HeaderFooterActivity.this, "Нажата картинка", Toast.LENGTH_SHORT).show(); break; case R.id.tv_title: Toast.makeText(HeaderFooterActivity.this, "Нажат заголовок", Toast.LENGTH_SHORT).show(); break; default: break; } });

3.7 Настройка функции бокового скольжения для удаления (например, как в QQ)

В файле макета пропущена часть кода:

<org.yczbj.ycrefreshviewlib.swipeMenu.YCSwipeMenu android:orientation="horizontal"> <RelativeLayout

<!-- Боковое меню -->
<Button
    android:id="@+id/btn_del"/>
<Button
    android:id="@+id/btn_top"/>

</org.yczbj.ycrefreshviewlib.swipeMenu.YCSwipeMenu>

Настройка в коде:

  • В адаптере определяется интерфейс:

    private OnSwipeMenuListener listener; public void setOnSwipeMenuListener(OnSwipeMenuListener listener) { this.listener = listener; }

  • Настройка событий клика в адаптере:

    View.OnClickListener clickListener = new View.OnClickListener() { @Override public void onClick(View v) { switch (v.getId()){ case R.id.btn_del: if (null != listener) { listener.toDelete(getAdapterPosition()); } break; case R.id.btn_top: if (null != listener) { listener.toTop(getAdapterPosition()); } break; } } btn_del.setOnClickListener(clickListener); btn_top.setOnClickListener(clickListener);

  • Обработка функций удаления или перемещения наверх:

    adapter.setOnSwipeMenuListener(new OnSwipeMenuListener() { //Функция удаления @Override public void toDelete(int position) {

    }

    //Функция перемещения наверх @Override public void toTop(int position) {

    } });

3.8 Лёгкая функция перетаскивания и скольжения для сортировки и удаления

Обработка функций длительного нажатия для перетаскивания, скольжения для удаления. Функция лёгкая, можно свободно выбирать, реализовывать её или нет.

mCallback = new DefaultItemTouchHelpCallback(new DefaultItemTouchHelpCallback .OnItemTouchCallbackListener() { @Override public void onSwiped(int adapterPosition) { // Удаление при скольжении, удаление из базы данных или источника данных, обновление UI }

@Override public boolean onMove(int srcPosition, int targetPosition) { return false; }}); mCallback.setDragEnable(true); mCallback.setSwipeEnable(true); mCallback.setColor(this.getResources().getColor(R.color.colorAccent)); Пункт 4. О состоянии переключения

4.1. О содержании макета YCRecyclerView — это составной пользовательский элемент управления, макет которого выглядит следующим образом:

<!--刷新控件    省略部分代码-->
<android.support.v4.widget.SwipeRefreshLayout>
    <FrameLayout>
        <!--RecyclerView控件-->
        <android.support.v7.widget.RecyclerView/>
        <!--Загрузка данных пуста, макет содержимого-->
        <FrameLayout/>
        <!--Загружается содержимое, макет-->
        <FrameLayout/>
        <!--Ошибка загрузки: сетевая ошибка или ошибка запроса данных, макет-->
        <FrameLayout/>
    </FrameLayout>
</android.support.v4.widget.SwipeRefreshLayout>

4.2. О реализации идеи Идея о переключении состояний на странице:

  • Первый способ: напрямую включить эти интерфейсы в основной интерфейс и динамически переключаться между ними. Однако позже было обнаружено, что этот метод не так легко использовать повторно в других проектах, и обработка отображения и скрытия состояний в Activity может быть беспорядочной.
  • Второй способ: использование дочерних классов для наследования характеристик родительского класса и обработки переключения состояний в родительском классе. Но как обрабатывать состояния, если некоторые интерфейсы не наследуют родительский класс?

Подход, используемый в этой библиотеке:

  • В FrameLayout одного кадра записываются четыре различных типа макетов: нормальный макет, пустой макет, макет загрузки и макет ошибки (сетевая аномалия, ошибка загрузки данных).
  • Конечно, вы также можете настроить эти состояния макета, добавив различные макеты состояний с помощью addView. Для переключения состояний просто нужно показать или скрыть макет.

4.3. Об API вызовах для переключения состояний Как показано ниже:

//Устанавливаем состояние загрузки данных завершено
recyclerView.showRecycler();
//Устанавливаем состояние загрузки данных пусто
recyclerView.showEmpty();
//Устанавливаем состояние ошибки загрузки
recyclerView.showError();
//Устанавливаем состояние загрузки данных в процессе
recyclerView.showProgress();

4.4. О настройке макета состояния Как показано ниже:

//Установка пользовательского макета страницы в состоянии пустоты
recyclerView.setEmptyView(R.layout.view_custom_empty_data);
recyclerView.setEmptyView(view);
//Получение пользовательского макета пустой страницы
View emptyView = recyclerView.getEmptyView();

//Настройка пользовательского макета страницы ошибки
recyclerView.setErrorView(R.layout.view_custom_data_error);
recyclerView.setErrorView(view);

//Настройка пользовательского макета загрузки страницы
recyclerView.setProgressView(R.layout.view_progress_loading);
recyclerView.setProgressView(view);

4.5. О взаимодействии событий обработки пользовательских макетов Иногда при возникновении аномальной ситуации во время загрузки страницы, например, при отсутствии сети, отображается пользовательская страница с ошибкой сети. Теперь необходимо выполнить такие действия, как нажатие кнопки на странице ошибки. Как это сделать?

//Обратите внимание на необходимость
LinearLayout ll_error_view = (LinearLayout) recyclerView.findViewById(R.id.ll_error_view);
ll_error_view.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        //Например, переход на страницу настроек сети, повторная загрузка данных или другие операции и т.д.
    }
});

Пункт 5. Введение в общие API

  • Методы переключения состояний:

    • Установка состояния загрузки данных завершена: recyclerView.showRecyler().
    • Установка состояния загрузки данных пусто: recyclerView.showEmpty().
    • Установка состояния ошибки загрузки: recyclerView.showError().
    • Установка состояния загрузки данных в процессе: recyclerView.showProgress().
    • Настройка пользовательского макета: остальные методы аналогичны.
  • Методы ViewHolder:

    • Метод установки данных подкласса: setData.
    • Способ findViewById: iv_news_image = getView(R.id.iv_news_image).
    • Получение контекста: Context context = getContext().
    • Получить позицию данных индекса: int dataPosition = getDataPosition().
    • Добавить событие щелчка элемента в дочернем элементе: addOnClickListener(R.id.tv_title).
  • Методы адаптера:

    • Удалить данные по индексу: adapter.remove(0).

    • Триггер для очистки всех данных: adapter.removeAll().

    • Добавление данных (добавление в конце): adapter.add(new PersonData()).

    • Добавьте все данные: adapter.addAll(DataProvider.getPersonList(0)).

    • Вставка данных: adapter.insert(data,3).

    • Вставить набор данных по индексу: adapter.insertAll(data,3).

    • Получите позицию элемента данных: adapter.getPosition(data).

    • Очистить все данные: adapter.clear().

    • Получите все данные: adapter.getAllData().

    • Удалите все нижние колонтитулы: adapter.removeAllFooter().

    • Удалите все заголовки: adapter.removeAllHeader().

    • Добавьте нижний колонтитул: adapter.addFooter(view).

    • Добавьте заголовок: adapter.addHeader(view).

    • Удалите нижний колонтитул: adapter.removeHeader(view).

    • Удалите верхний колонтитул: adapter.removeFooter(view).

    • Получите нижний колонтитул по индексу: adapter.getHeader(0).

    • Получите верхний колонтитул по индексу: adapter.getFooter(0).

    • Подсчитайте количество нижних колонтитулов: adapter.getFooterCount().

    • Подсчитайте количество верхних колонтитулов: adapter.getHeaderCount().

    • Установите пользовательский макет и прослушиватель для загрузки сверху: adapter.setMore(R.layout.view_more,listener).

    • Установите пользовательский макет и слушатель для загрузки сверху: adapter.setMore(view,listener).

    • Установите макет без дополнительной загрузки: adapter.setNoMore(R.layout.view_nomore).

    • Установите макет без дополнительной нагрузки: adapter.setNoMore(view).

    • Установите слушателя для загрузки без дополнительной нагрузки: adapter.setNoMore(R.layout.view_nomore,listener).

    • Установите аварийный макет: adapter.setError(R.layout.view_error). 11. Загрузка при подтягивании RecyclerView

12. Принцип кэширования RecyclerView

13. Анализ исходного кода SnapHelper

16. Пользовательский SnapHelper

19. Пользовательское оформление ItemDecoration: разделительные линии

22. Сводка проблем с RecyclerView

23. Конфликты скольжения RecyclerView

24. Проблемы вложенности ScrollView и RecyclerView

7. Демонстрация реализации

7.1 Примеры использования библиотеки YCRefreshView

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

7.2 Изображения с примерами эффектов

Изображения с примерами эффектов:

1.jpg 2.jpg 3.jpg 4.jpg 5.jpg 6.jpg 7.jpg 8.jpg 9.jpg 10.jpg 11.jpg 12.jpg.

7.3 Примеры изображений (частично)

Примеры изображений можно найти в разделе 7.1.

8. История обновлений

v1.0 — обновление от 2 ноября 2016 года; v1.1 — обновление от 13 марта 2017 года; v1.3 — обновление от 9 августа 2017 года; v1.… — обновление от 5 января 2018 года; v2.2 — обновление от 17 января 2018 года; v2.3 — обновление от 9 февраля 2018 года; v2.4 — обновление от 19 марта 2018 года; v2.5.6 — обновление от 6 августа 2018 года; v2.5.7 — обновление от 3 марта 2019 года; v2.5.8 — обновление от 4 марта 2019 года.

9. Список использованных источников

Выражаю огромную благодарность старшим коллегам за идеи и примеры кода, спасибо!

https://github.com/XRecyclerView/XRecyclerView; https://github.com/bingoogolapple/BGARefreshLayout-Android; https://github.com/chrisbanes/Android-PullToRefresh; https://github.com/CymChad/BaseRecyclerViewAdapterHelper; https://github.com/mikepenz/FastAdapter. 10. Другие материалы

О других материалах

Изображение

1. О сборниках блогов

2. Обо мне

— Мой личный сайт: www.yczbj.org, www.ycbjie.cn. — GitHub: https://github.com/yangchong211. — Zhihu: https://www.zhihu.com/people/yczbj/activities. — Jianshu: http://www.jianshu.com/u/b7b2c6ed9284. — CSDN: http://my.csdn.net/m0_37700275. — Слушаю книги на «Хэмалайе»: http://www.ximalaya.com/zhubo/71989305/. — «Открытые китайские технологии»: https://my.oschina.net/zbj1618/blog. — Жизнь в сети: http://www.jcodecraeer.com/member/content_list.php?channelid=1. — Электронная почта: yangchong211@163.com. — Блог на облаке Alibaba: https://yq.aliyun.com/users/article?spm=5176.100-239.headeruserinfo.3.dT4bcV. — Статьи на Segmentfault: https://segmentfault.com/u/xiangjianyu/articles. — Baidu Knows: https://juejin.im/user/5939433efe88c2006afa0c6e.

3. Исправления и вопросы

Если у вас есть вопросы или вы обнаружили ошибку, вы можете задать вопрос или внести исправления в соответствующем разделе issues. Если вам нравится этот материал или он вас вдохновил, вы можете поставить ему звезду. Это будет поощрением для автора.

4. О лицензии

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 )

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

1
https://api.gitlife.ru/oschina-mirror/yangchong-YCRefreshView.git
git@api.gitlife.ru:oschina-mirror/yangchong-YCRefreshView.git
oschina-mirror
yangchong-YCRefreshView
yangchong-YCRefreshView
master