Project Name | Stars | Downloads | Repos Using This | Packages Using This | Most Recent Commit | Total Releases | Latest Release | Open Issues | License | Language |
---|---|---|---|---|---|---|---|---|---|---|
Shimmerrecyclerview | 3,458 | 3 years ago | 13 | other | Kotlin | |||||
All Base Adapter | 528 | 6 years ago | 5 | apache-2.0 | Java | |||||
Adapter terminator, including DataBinding, any ViewGroup, list(Rv, Lv ). Write Adapter, it is enough .Adapter终结者,包含DataBinding,任意ViewGroup,Rv、Lv列表。写Adapter,有它就够了 | ||||||||||
Adapterlayout | 57 | 3 years ago | 2 | apache-2.0 | Kotlin | |||||
ViewGroup backed by RecyclerView.Adapter = magic | ||||||||||
Universaladapter | 53 | 8 years ago | apache-2.0 | Java | ||||||
A single adapter implementation for any scrolling view or ViewGroup. | ||||||||||
Adapter Databinding | 11 | 3 years ago | apache-2.0 | Kotlin | ||||||
adapter-databinding | ||||||||||
Xebicon 2013__cc In Aa | 9 | 10 years ago | Java | |||||||
A demonstration of the "Custom ViewGroup" advice given during the Clean Code in Android Apps talk of XebiCon 2013. | ||||||||||
Listview | 3 | 7 years ago | Java | |||||||
a samples of ListView | ||||||||||
Android Stacklayout | 2 | 9 years ago | mit | Java | ||||||
Custom ViewGroup of which the top element can be swept away. | ||||||||||
Gsectioned Recyclerview | 2 | 4 years ago | mit | Kotlin | ||||||
Biblioteca criada de modo a facilitar a criação de um RecyclerView com seções, algo muito comum em diversas aplicações. | ||||||||||
Simplemvp_android | 2 | 5 years ago | Java | |||||||
Esta biblioteca foi criada de modo a facilitar a criação de um RecyclerView com seções, algo muito comum em diversas aplicações. Abaixo segue um breve exemplo do funcionamento da biblioteca.
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
implementation 'com.github.gustavobarbosab:gsectioned-recyclerview:1.2-BETA'
class HeaderViewHolder(view: View) : SectionedRecyclerAdapter.SectionedHeaderViewHolder(view) {
val title: TextView = view.findViewById(R.id.tvHeaderMain)
}
class BodyViewHolder(view: View) : SectionedRecyclerAdapter.SectionedBodyViewHolder(view) {
val titleText: TextView = view.findViewById(R.id.tvBodyMain)
}
class MainRecyclerAdapter :
SectionedRecyclerAdapter<MainRecyclerAdapter.HeaderViewHolder,MainRecyclerAdapter.BodyViewHolder>()
...
Feito os passos acima, partiremos para a implementação do adapter
Deverá retornar somente o id do layout do Body.
override fun getBodyLayout(): Int = R.layout.item_body_main
Deverá retornar somente o id do layout do Header.
override fun getHeaderLayout(): Int = R.layout.item_header_main
O método recebe como parametro o viewGroup, que pode ser usado para inflar a view da forma que convier. Caso não esteja usando DataBinding e deseje inflar a view através do LayoutInflater, basta chamar o método inflateHeader, passando o ViewGroup como parametro.
override fun onCreateHeaderViewHolder(parent: ViewGroup): HeaderViewHolder {
val view = inflateHeader(parent)
return HeaderViewHolder(view)
}
O mesmo ocorre aqui, basta chamar o método inflateBody, passando o ViewGroup como parametro.
override fun onCreateBodyViewHolder(parent: ViewGroup): BodyViewHolder {
val view = inflateBody(parent)
return BodyViewHolder(view)
}
Deve retornar o tamanho da lista de Headers.
override fun getHeaderSize(): Int = list.size
Deve retornar o tamanho do Body de determinado Header.
override fun getBodySize(headerPosition: Int): Int = list[headerPosition].bodies.size
Aqui é feito o bind do Header View Holder, conforme ocorre no Adapter convencional.
override fun onBindHeaderViewHolder(viewHolder: HeaderViewHolder, headerPosition: Int) {
val header = list[headerPosition]
viewHolder.title.text = header.title
}
Aqui é feito o bind do Body View Holder, conforme ocorre no Adapter convencional.
override fun onBindBodyViewHolder(viewHolder: BodyViewHolder, headerPosition: Int, bodyPosition: Int) {
val header = list[headerPosition]
val body = header.bodies[bodyPosition]
viewHolder.titleText.text = body.value
}
De modo a fazer os calculos necessários para manipulação das posições de Header e Body, ao notificar alterações no adapter, usar os seguintes métodos.
fun setList(newList: List<HeaderModel>) {
list.clear()
list.addAll(newList)
notifySectionedDataChanged() // Use este método
}
// Exemplo de inclusão no inicio da lista
fun addList(newItems: List<HeaderModel>) {
list.addAll(0,newItems)
notifySectionedItemRangeInserted(0,newItems.size)
}
// Exemplo de exclusão no inicio da lista
fun removeItem(index: Int) {
list.removeAt(index)
notifySectionedItemRemoved(index)
}
O mesmo é feito para remoção de itens em um intervalo, basta chamar o método: notifySectionedItemRangeRemoved.
Para usar o header fixo no topo, como mostra no gif acima. Basta adicionar o StickHeaderItemDecoration em seu RecyclerView.
private fun setupRecyclerView() {
rvMain.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)
rvMain.adapter = adapter
rvMain.addItemDecoration(StickHeaderItemDecoration(adapter))
adapter.setList(model)
}
Caso queira um exemplo de como implementar e usar a biblioteca, acesse GSectioned Example.
Email: [email protected]