Le FastAdapter est là pour simplifier la création d'adaptateurs pour les recyclerviews. Ne vous inquiétez plus de l'adaptateur. Écrivez simplement la logique pour quoi ressembler votre vue / élément, et vous avez terminé. Il flamboie rapidement, minimisant le code que vous devez écrire et est facile à étendre.
Qu'est-ce qui est inclus • Configuration • Guide de migration? • Utilisé par • Exemple d'application
La bibliothèque est divisée en noyau, communes et extensions. Les fonctions principales sont incluses dans la dépendance suivante.
implementation " com.mikepenz:fastadapter: ${ latestFastAdapterRelease } "
implementation " androidx.appcompat:appcompat: ${ androidX } "
implementation " androidx.recyclerview:recyclerview: ${ androidX } "Un support extensible est inclus et peut être ajouté via ce
implementation " com.mikepenz:fastadapter-extensions-expandable: ${ latestFastAdapterRelease } "De nombreuses classes d'assistance sont incluses dans la dépendance suivante.
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 } " Créez simplement une classe qui étend l' AbstractItem comme indiqué ci-dessous. Implémentez les méthodes et votre article est prêt.
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 )
}
} Utilisez la dépendance d'extension binding dans votre application pour cela.
// 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 ) Par défaut, le FastAdapter fournit uniquement des fonctionnalités de base, qui sont livrées avec l'abstraction des éléments comme Item et Model . Et la fonctionnalité générale de l'ajout / supprimer / modifier les éléments. Pour activer les sélections ou expandables , les extensions fournies doivent être activées.
// 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. Cela nécessite l'extension
fastadapter-extensions-expandable.
// Gets (or creates and attaches if not yet existing) the extension.
val expandableExtension = fastAdapter.getExpandableExtension()
// configure as needed
expandableExtension.isOnlyOneExpandedItem = true Pour plus de détails, faites défiler vers la section ExpandableItems (dans l'usage avancé).
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() doit retourner vrai pour les éléments à conserver et faux pour les éléments à supprimer.
Cela nécessite l'extension
fastadapter-extensions-drag.
Tout d'abord, joignez ItemTouchHelper à recyclerView.
val dragCallback = SimpleDragCallback ()
val touchHelper = ItemTouchHelper (dragCallback)
touchHelper.attachToRecyclerView(recyclerView) Implémentez l'interface ItemTouchCallback dans votre activité et remplacez la méthode itemTouchOnMove() .
override fun itemTouchOnMove ( oldPosition : Int , newPosition : Int ): Boolean {
DragDropUtil .onMove(fastItemAdapter.itemAdapter, oldPosition, newPosition) // change position
return true
}Commencez par initialiser vos adaptateurs:
// Header is a model class for your header
val headerAdapter = ItemAdapter < Header >()Initialiser un modèle FastAdapter:
val itemAdapter = GenericItemAdapter ()Enfin, définissez l'adaptateur:
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) Créez un pied de page. Nous en avons besoin pour afficher une barre de progrès de chargement à la fin de notre liste. (N'oubliez pas de le passer dans FastAdapter.with(..) )
val footerAdapter = ItemAdapter < ProgressItem >()Gardez à l'esprit que ProgressItem est fourni par les extensions de 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 )
}
})Pour le tutoriel complet et plus de fonctionnalités telles que Multi-Select et CAB, consultez l'exemple d'application.
FastAdapter avec Proguard Le FastAdapter est livré avec une prise en charge des articles extensibles. Après avoir ajouté la dépendance, configurez l'extension Expandable via:
val expandableExtension = fastAdapter.getExpandableExtension() Les éléments extensibles doivent implémenter l'interface IExpandable et les sous-éléments de l'interface ISubItem . Cela permet un meilleur support. L'exemple d'application fournit des exemples d'implémentations de ceux-ci. (Ceux de l'échantillon sont gardés un modèle qui leur permet d'être utilisés avec différents parents / sous-éléments)
Depuis la façon dont SubItems et leur état sont gérés, il est fortement recommandé d'utiliser le StateManagement basé sur identifier . Il suffit d'ajouter withPositionBasedStateManagement(false) à votre configuration FastAdapter .
Un élément simple doit simplement s'étendre à partir du type AbstractExpandableItem et fournir le ViewHolder comme type.
open class SimpleSubExpandableItem : AbstractExpandableItem < SimpleSubExpandableItem . ViewHolder >() {
/* *
* BASIC ITEM IMPLEMENTATION
*/
} // Voir la SimpleSubExpandableItem.kt de l'exemple d'application pour plus de détails.
Mike Penz:
Mike Penz
Fabian Terhorst
Ce logiciel gratuit et open source a également été rendu possible par un groupe de bénévoles qui y mettent de nombreuses heures de dur labeur. Voir le fichier contributeurs.md pour plus de détails.
Un merci spécial aux contributeurs très actifs qui ont ajouté de nombreuses améliorations à cette bibliothèque.
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.