Fastadapter здесь, чтобы упростить создание адаптеров для переработки. Не беспокойтесь о адаптере больше. Просто напишите логику для того, как должно выглядеть ваше представление/элемент, и все готово. Он быстро сверкает, сводит к минимуму код, который вам нужно написать, и легко расширить.
Что включено • Настройка • Руководство по миграции? • Используется • Примером примера
Библиотека разделена на ядро, общее количество и расширения. Основные функции включены в следующую зависимость.
implementation " com.mikepenz:fastadapter: ${ latestFastAdapterRelease } "
implementation " androidx.appcompat:appcompat: ${ androidX } "
implementation " androidx.recyclerview:recyclerview: ${ androidX } "Расширяемая поддержка включена и может быть добавлена через это
implementation " com.mikepenz:fastadapter-extensions-expandable: ${ latestFastAdapterRelease } "Многие вспомогательные классы включены в следующую зависимость.
implementation " com.mikepenz:fastadapter-extensions-binding: ${ latestFastAdapterRelease } " // view binding helpers
implementation " com.mikepenz:fastadapter-extensions-diff: ${ latestFastAdapterRelease } " // diff util helpers
implementation " com.mikepenz:fastadapter-extensions-drag: ${ latestFastAdapterRelease } " // drag support
implementation " com.mikepenz:fastadapter-extensions-paged: ${ latestFastAdapterRelease } " // paging support
implementation " com.mikepenz:fastadapter-extensions-scroll: ${ latestFastAdapterRelease } " // scroll helpers
implementation " com.mikepenz:fastadapter-extensions-swipe: ${ latestFastAdapterRelease } " // swipe support
implementation " com.mikepenz:fastadapter-extensions-ui: ${ latestFastAdapterRelease } " // pre-defined ui components
implementation " com.mikepenz:fastadapter-extensions-utils: ${ latestFastAdapterRelease } " // needs the `expandable`, `drag` and `scroll` extension.
// required for the ui components and the utils
implementation " com.google.android.material:material: ${ androidX } " Просто создайте класс, который расширяет AbstractItem как показано ниже. Реализуйте методы, и ваш элемент готов.
open class SimpleItem : AbstractItem < SimpleItem . ViewHolder >() {
var name : String? = null
var description : String? = null
/* * defines the type defining this item. must be unique. preferably an id */
override val type : Int
get() = R .id.fastadapter_sample_item_id
/* * defines the layout which will be used for this item in the list */
override val layoutRes : Int
get() = R .layout.sample_item
override fun getViewHolder ( v : View ): ViewHolder {
return ViewHolder (v)
}
class ViewHolder ( view : View ) : FastAdapter.ViewHolder<SimpleItem>(view) {
var name : TextView = view.findViewById( R .id.material_drawer_name)
var description : TextView = view.findViewById( R .id.material_drawer_description)
override fun bindView ( item : SimpleItem , payloads : List < Any >) {
name.text = item.name
description.text = item.name
}
override fun unbindView ( item : SimpleItem ) {
name.text = null
description.text = null
}
}
}
class BindingIconItem : AbstractBindingItem < IconItemBinding >() {
var name : String? = null
override val type : Int
get() = R .id.fastadapter_icon_item_id
override fun bindView ( binding : IconItemBinding , payloads : List < Any >) {
binding.name.text = name
}
override fun createBinding ( inflater : LayoutInflater , parent : ViewGroup ? ): IconItemBinding {
return IconItemBinding .inflate(inflater, parent, false )
}
} Используйте зависимость удлинения binding в вашем приложении для этого.
// create the ItemAdapter holding your Items
val itemAdapter = ItemAdapter < SimpleItem >()
// create the managing FastAdapter, by passing in the itemAdapter
val fastAdapter = FastAdapter . with (itemAdapter)
// set our adapters to the RecyclerView
recyclerView.setAdapter(fastAdapter)
// set the items to your ItemAdapter
itemAdapter.add( ITEMS ) По умолчанию FastAdapter предоставляет только базовую функциональность, которая поставляется с абстракцией элементов в качестве Item и Model . И общая функциональность добавления/удаления/модификации элементов. Для включения выбора или расширения необходимо активировать предоставленные расширения.
// Gets (or creates and attaches if not yet existing) the extension from the given `FastAdapter`
val selectExtension = fastAdapter.getSelectExtension()
// configure as needed
selectExtension.isSelectable = true
selectExtension.multiSelect = true
selectExtension.selectOnLongClick = false
// see the API of this class for more options. Это требует
fastadapter-extensions-expandable.
// Gets (or creates and attaches if not yet existing) the extension.
val expandableExtension = fastAdapter.getExpandableExtension()
// configure as needed
expandableExtension.isOnlyOneExpandedItem = true Для получения дополнительной информации прокрутите вниз в раздел ExpandableItems (в разделе «Расширенное использование»).
fastAdapter.onClickListener = { view, adapter, item, position ->
// Handle click here
false
} // just add an `EventHook` to your `FastAdapter` by implementing either a `ClickEventHook`, `LongClickEventHook`, `TouchEventHook`, `CustomEventHook`
fastAdapter.addEventHook( object : ClickEventHook < SimpleImageItem >() {
override fun onBind ( viewHolder : RecyclerView . ViewHolder ): View ? {
// return the views on which you want to bind this event
return if (viewHolder is SimpleImageItem . ViewHolder ) {
viewHolder.viewWhichReactsOnClick
} else {
null
}
}
override fun onClick ( v : View , position : Int , fastAdapter : FastAdapter < SimpleImageItem >, item : SimpleImageItem ) {
// react on the click event
}
}) // Call this in onQueryTextSubmit() & onQueryTextChange() when using SearchView
itemAdapter.filter( " yourSearchTerm " )
itemAdapter.itemFilter.filterPredicate = { item : SimpleItem , constraint : CharSequence? ->
item.name?.text.toString().contains(constraint.toString(), ignoreCase = true )
} filter() должен вернуть true для сохранения элементов и ложных для удаления элементов.
Это требует расширения
fastadapter-extensions-drag.
Во -первых, прикрепите ItemTouchHelper к Recyclerview.
val dragCallback = SimpleDragCallback ()
val touchHelper = ItemTouchHelper (dragCallback)
touchHelper.attachToRecyclerView(recyclerView) Реализуйте интерфейс ItemTouchCallback в своей деятельности и переопределите метод itemTouchOnMove() .
override fun itemTouchOnMove ( oldPosition : Int , newPosition : Int ): Boolean {
DragDropUtil .onMove(fastItemAdapter.itemAdapter, oldPosition, newPosition) // change position
return true
}Начните с инициализации ваших адаптеров:
// Header is a model class for your header
val headerAdapter = ItemAdapter < Header >()Инициализировать модель FASTADAPTER:
val itemAdapter = GenericItemAdapter ()Наконец, установите адаптер:
val fastAdapter : GenericFastAdapter = FastAdapter . with (headerAdapter, itemAdapter) // the order defines in which order the items will show up
// alternative the super type of both item adapters can be used. e.g.:
recyclerView.setAdapter(fastAdapter) Создайте носитель. Нам нужно это, чтобы отобразить загрузку ProgressBar в конце нашего списка. (Не забудьте передать его в FastAdapter.with(..) )
val footerAdapter = ItemAdapter < ProgressItem >()Имейте в виду, что ProgressItem обеспечивается расширениями FastAdapter.
recyclerView.addOnScrollListener( object : EndlessRecyclerOnScrollListener (footerAdapter) {
override fun onLoadMore ( currentPage : Int ) {
footerAdapter.clear()
footerAdapter.add( ProgressItem ())
// Load your items here and add it to FastAdapter
itemAdapter.add( NEWITEMS )
}
})Для получения полного учебника и дополнительных функций, таких как мультисборная и кабина, ознакомьтесь с приложением примера.
FastAdapter с прогнором FastAdapter поставляется с поддержкой расширяемых предметов. После добавления зависимости настройка Expandable расширения через:
val expandableExtension = fastAdapter.getExpandableExtension() Расширяемые элементы должны реализовать интерфейс IExpandable , а подразделение интерфейса ISubItem . Это обеспечивает лучшую поддержку. Приложение приложения предоставляет образцы реализаций их. (Те, кто в выборке, хранятся в модели, которая позволяет использовать их с разными родителями / субситемами)
На основании того, как обрабатываются SubItems и их состояние, настоятельно рекомендуется использовать StateManagement на основе identifier . Просто добавьте withPositionBasedStateManagement(false) к вашей настройке FastAdapter .
Простой элемент просто должен простираться от AbstractExpandableItem и предоставить владельца ViewHolder как тип.
open class SimpleSubExpandableItem : AbstractExpandableItem < SimpleSubExpandableItem . ViewHolder >() {
/* *
* BASIC ITEM IMPLEMENTATION
*/
} // См. SimpleSubExpandableItem.kt применения приложения для получения более подробной информации.
Майк Пенз:
Майк Пенз
Фабиан Терхорст
Это бесплатное программное обеспечение с открытым исходным кодом также стало возможным благодаря группе добровольцев, которые вкладывают в него много часов тяжелой работы. См. Файл Antormors.md для получения подробной информации.
Особая благодарность очень активным участникам, которые добавили много улучшений в эту библиотеку.
Copyright 2021 Mike Penz
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.