https://github.com/boybeak/anyadapter
An adapter that can work for all kind of data.
https://github.com/boybeak/anyadapter
Last synced: 5 months ago
JSON representation
An adapter that can work for all kind of data.
- Host: GitHub
- URL: https://github.com/boybeak/anyadapter
- Owner: boybeak
- Created: 2020-01-05T12:23:48.000Z (over 6 years ago)
- Default Branch: master
- Last Pushed: 2022-07-21T06:43:02.000Z (about 4 years ago)
- Last Synced: 2025-05-13T00:48:22.635Z (about 1 year ago)
- Language: Java
- Homepage:
- Size: 4.17 MB
- Stars: 4
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README-CN.md
Awesome Lists containing this project
README
# AnyAdapter [  ](https://bintray.com/boybeak/nulldreams/any-adapter/_latestVersion)
## 安装
```groovy
buildscript {
repositories {
jcenter()
}
}
```
```groovy
implementation 'com.github.boybeak:any-adapter:version'
```

## 使用
```kotlin
val adapter = new AnyAdapter()
// Or you can use FooterAdapter, AutoFooterAdapter
recyclerView.adapter = adapter
```
你的model类必须被 `ItemImpl`所包裹. `T`就是你要展现的数据. AnyAdapter 只接受 `ItemImpl`的子类作为其中的Item, 实际上,继承 `AbsItem`会更方便.
```kotlin
// A data example.
data class Post(val id: Int, val title: String, val text: String)
```
```kotlin
// An item example.
class PostItem(post: Post) : AbsItem(post) {
override fun layoutId(): Int {
return R.layout.xxx
}
override fun holderClass(): Class {
return PostHolder::class.java
}
override fun areContentsSame(other: ItemImpl<*>): Boolean {
if (other is PostItem) {
val os = other.source()
return source().id == os.id && source().title == os.title
&& source().text == os.text
}
return false
}
}
```
```kotlin
// A holder example
class PostHolder(v: View) : AbsHolder(v) {
override fun onBind(item: JourneyItem, position: Int, absAdapter: AnyAdapter) {
// Fill content to the view.
}
}
```
### Add and addAll
#### add
```kotlin
val post = xxx
adapter.add(PostItem(post))
// Or adapter.add(position, PostItem(post))
```
这是一个非常典型的 `add` 操作. 再也不用执行 **notifyDataXXXChanged** 操作了. 数据刷新是自动完成的.
另外一个 **one-to-many** 添加函数能够将一个单一数据转换成一组数据添加进来.
```kotlin
adapter.add(post, object : IConverter {
override fun convert(s: Post): List {
return mutableListOf(
TextItem(s.title), TextItem(s.text)
)
}
})
```
#### addAll
```kotlin
val posts = ArrayList();
val postItems = List(posts.size) { index ->
PostItem(posts[index])
}
// Fill data to post
adapter.addAll(postItems)
// Or adapter.add(position, postItems)
```
实际上,你可以使用更为方便快捷的方式,如下:
```kotlin
adapter.addAll(posts, object : AnyAdapter.IEachConverter {
override fun convert(s: Post, position: Int): PostItem {
return PostItem(s)
}
})
/* With lamada
* adapter.addAll(posts) { s, position ->
PostItem(s)
}
*/
```
### Remove
**单个删除**
使用 `remove(Int)` 或者 `remove(Item)`.
**多个删除**
删除数据集合, 使用 `removeAll(Collection)`;
条件删除, 使用 `removeBy(IFilter)`;
类型条件删除, 使用 `removeBy(Class, IFilter)`;
类型删除, 使用 `removeAll(Class)`;
删除所有, 使用 `clear()`;
### Replace
`replace(position, item)`.
### FilterRun
`filterRun(IFilter, IRun)` - 如果`IFilter`返回true, 则执行 `IRun`;
`filterRun(Class, IFilter, IRun)` - 如果是 `Class` 类型并且 `IFilter`返回true, 执行 `IRun` ;
### Selector
内置两个选择器, `SingleSelector` 和 `MultipleSelector`.
你可以通过 `singleSelectorFor(Class)` 或者 `multipleSelectorFor(Class)`来获取对应的选择器. 当第一次调用 `SingleSelector` 或者 `MultipleSelector` 的时候,对应的实例将被创建.
> 在使用选择功能前, 请确保你的item class支持选择. 在你的item class中重写 **supportSelect** 方法并且返回true.
在调用 `select`前,先调用 `begin()` 以确保选择器进去选择状态.
```kotlin
val selector = adapter.singleSelectorFor(Post::class.java)
selector.begin()
selector.select(0) // Select the 0 item
selector.remove() // Remove the selected item
```
执行相关操作后, 调用 `end()`结束选择状态.
### Sort
```kotlin
adapter.sortWith(Comparator{ o1, o2 ->
o1.source().title.compareTo(o2.source().title)
})
```
### OnClick and OnLongClick
**OnClick**
```kotlin
adapter.setOnClickFor(PostItem::class.java, object : OnClick {
override fun getClickableIds() {
return intArrayOf(0, R.id.post_title) // 0 for the itemView
}
override fun onClick(view: View, item: PostItem, position: Int, adapter: AnyAdapter) {
when(view.id) {
R.id.post_title -> {
}
else -> {
// Do item click here
}
}
}
})
```
如果你只想为整个item设置点击事件, 你可以直接使用 `OnItemClick` . 不用再重写 *getClickableIds*.
**OnLongClick**
```kotlin
adapter.setOnLongClickFor(PostItem::class.java, object : OnClick {
override fun getLongClickableIds() {
return intArrayOf(0, R.id.post_title) // 0 for the itemView
}
override fun onLongClick(view: View, item: PostItem, position: Int, adapter: AnyAdapter): Boolean {
when(view.id) {
R.id.post_title -> {
}
else -> {
// Do item click here
}
}
return true
}
})
```
如果你只想为整个item设置长按事件, 你可以直接使用 `OnItemLongClick`. 无需再重写 *getLongClickableIds*.
> 如果点击事件和长按事件都要设置,你可以使用 `OnItemEvent` ,既是 `OnItemClick` 又是 `OnItemLongClick`.
另外一种方法,可以在创建adapter时候直接设置相关事件。
```kotlin
private val adapter = AutoFooterAdapter(FooterItem(Footer()))
.withOnClicks(
object : AbsOnItemClick(SongItem::class.java) {
override fun onItemClick(
view: View,
item: SongItem,
position: Int,
adapter: AnyAdapter
) {
TODO("Not yet implemented")
}
}
)
.withOnLongClicks(
)
```
# One more thing!!!
你可以使用 [AnyAdapterPlugin](https://github.com/boybeak/AnyAdapterPlugin) 来产生 `item` `holder` 对, 如果你使用了viewBinding,还可以在holder类中,添加对应的binding对象.


