Библиотека сложных страниц: введение.
Описание: библиотека для создания сложных страниц с поддержкой различных состояний, таких как загрузка данных, ошибки и т. д., а также возможностью свободного переключения между этими состояниями. Библиотека позволяет создавать сложные типы страниц, такие как добавление пользовательских заголовков и нижних колонтитулов, поддержка горизонтального пролистывания списка и другие функции.
Преимущества библиотеки: основные моменты.
Поддержка различных состояний: возможность настройки различных состояний представления (например, загрузка данных, ошибка сети) и лёгкое переключение между ними.
Добавление нескольких заголовков и нижних колонтитулов: поддержка добавления нескольких пользовательских заголовков и нижних колонтитулов для более гибкой настройки интерфейса.
Горизонтальное пролистывание и перетаскивание: реализация функций горизонтального пролистывания и перетаскивания элементов списка.
Другие преимущества: описание других полезных функций библиотеки, таких как удаление элементов при боковом пролистывании.
Использование библиотеки: руководство.
Основы использования: базовые шаги по интеграции библиотеки в проект и настройке основных параметров.
Настройка событий обновления: добавление обработчиков событий для обновления данных (например, при прокрутке вверх или вниз).
Установка заголовков и нижних колонтитулов: настройка отображения заголовков и нижних колонтитулов.
Управление данными и обновление: управление данными в списке и их обновление.
Настройка адаптера: настройка адаптера для работы с данными.
Обработка событий кликов на элементах списка: настройка обработчиков кликов на элементах списка.
Удаление элементов при боковом пролистывании: реализация функции удаления элементов при боковом пролистывании списка.
Лёгкое перетаскивание и пролистывание: настройка лёгкого перетаскивания и пролистывания элементов списка.
О переключении состояний: информация.
Структура содержимого: описание структуры содержимого при переключении между различными состояниями представления.
Реализация логики переключения: объяснение логики реализации переключения между состояниями.
Вызов API для переключения состояний: информация о вызове API для управления состояниями.
Пользовательские макеты состояний: возможности настройки пользовательских макетов для различных состояний.
Обработка интерактивных событий: обработка интерактивных событий при переключении состояний.
Часто используемые API: обзор.
Методы переключения состояний: описание методов для переключения между различными состояниями.
Методы ViewHolder: методы класса ViewHolder для работы с элементами списка.
Методы адаптера: методы адаптера для управления данными.
Разделительные линии: методы для добавления разделительных линий в список.
Пролистывание при боковом движении: методы для реализации пролистывания при боковом движении.
Прочие API: дополнительные API, предоставляемые библиотекой.
Документация RecyclerView: обновление.
Идеи для упаковки библиотеки: общие идеи и подходы к упаковке библиотеки.
Логика оптимизации обработки: оптимизация логики обработки данных в библиотеке.
Классы, связанные с RecyclerView: классы, связанные с использованием RecyclerView в библиотеке.
Конфликты при пролистывании RecyclerView: проблемы с конфликтами при пролистывании в RecyclerView.
Механизм кэширования RecyclerView: механизм кэширования данных в RecyclerView.
Ссылки на блоги (25 статей): ссылки на статьи и блоги, посвящённые использованию RecyclerView.
Демонстрация эффектов: примеры.
Обновление при прокрутке вниз и загрузка новых данных при прокрутке вверх: демонстрация эффекта обновления данных при прокрутке вниз и загрузки новых данных при прокрутке вверх.
Добавление заголовков и нижних колонтитулов: пример добавления пользовательских заголовков и нижних колонтитулов в интерфейс.
Боковое пролистывание списка: демонстрация горизонтального пролистывания списка элементов.
Вставка заголовков: пример вставки заголовков в список элементов.
Совместное использование с CoordinatorLayout: интеграция с CoordinatorLayout для создания более сложных эффектов.
Эффект каскадного потока: демонстрация каскадного потока элементов в списке.
Обновления версий: информация о последних изменениях.
Справочные материалы: список источников и ресурсов.
Дополнительная информация: прочие сведения о библиотеке. Добавление выпадающей функции обновления и функции загрузки дополнительных данных
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. Добавление заголовка и нижнего колонтитула:
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);
}
});
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. О реализации идеи Идея о переключении состояний на странице:
Подход, используемый в этой библиотеке:
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
.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
Можно напрямую обратиться к демо или другим примерам, которые я использовал. В этих примерах используется данная библиотека:
Изображения с примерами эффектов:
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.1.
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 года.
Выражаю огромную благодарность старшим коллегам за идеи и примеры кода, спасибо!
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 )