Skip to content

Commit

Permalink
released 2.6.2. Fixed handling clicks in PagingAdapter.
Browse files Browse the repository at this point in the history
  • Loading branch information
gotev committed May 19, 2019
1 parent 794f87f commit f703448
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 26 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ In this way every item of the recycler view has its own set of files, resulting
## <a name="setup"></a>Setup
In your gradle dependencies add:
```groovy
def recyclerAdapterVersion = "2.6.1" // change it with the version you want to use
def recyclerAdapterVersion = "2.6.2" // change it with the version you want to use
implementation "net.gotev:recycleradapter:$recyclerAdapterVersion"
```
This is the latest version: [ ![Download](https://api.bintray.com/packages/gotev/maven/recycler-adapter/images/download.svg) ](https://bintray.com/gotev/maven/recycler-adapter/_latestVersion)
Expand Down
2 changes: 1 addition & 1 deletion manifest.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ ext {
library_licenses = ["Apache-2.0"]
library_licenses_url = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
library_project_group = 'net.gotev'
library_version = '2.6.1'
library_version = '2.6.2'
version_code = 5
min_sdk = 18
target_sdk = 28
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,22 @@ import androidx.paging.PagedList
import androidx.paging.PagedListAdapter
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView.NO_ID
import net.gotev.recycleradapter.AdapterItem
import net.gotev.recycleradapter.RecyclerAdapterViewHolder
import net.gotev.recycleradapter.castAsIn
import net.gotev.recycleradapter.viewType
import net.gotev.recycleradapter.*

class PagingAdapter(
dataSource: () -> DataSource<*, *>,
config: PagedList.Config
) : PagedListAdapter<AdapterItem<*>, RecyclerAdapterViewHolder>(diffCallback) {
dataSource: () -> DataSource<*, *>,
config: PagedList.Config
) : PagedListAdapter<AdapterItem<*>, RecyclerAdapterViewHolder>(diffCallback), RecyclerAdapterNotifier {

companion object {
val diffCallback = object : DiffUtil.ItemCallback<AdapterItem<*>>() {
override fun areItemsTheSame(oldItem: AdapterItem<*>, newItem: AdapterItem<*>) =
oldItem == newItem

override fun areContentsTheSame(oldItem: AdapterItem<*>, newItem: AdapterItem<*>) =
!oldItem.hasToBeReplacedBy(oldItem)
}
}

private val dataSourceFactory: DataSourceFactory<Any> = DataSourceFactory(dataSource)
private val data = LivePagedListBuilder<Any, AdapterItem<*>>(dataSourceFactory, config).build()
Expand All @@ -34,43 +41,50 @@ class PagingAdapter(
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = currentList
?.find { it.viewType() == viewType }
?.createItemViewHolder(parent)
?: throw IllegalStateException("Item not found")
?.find { it.viewType() == viewType }
?.createItemViewHolder(parent)
?: throw IllegalStateException("Item not found")

override fun onBindViewHolder(holder: RecyclerAdapterViewHolder, position: Int) {
bindItem(holder, position, true)
}

override fun onBindViewHolder(
holder: RecyclerAdapterViewHolder,
position: Int,
payloads: MutableList<Any>
holder: RecyclerAdapterViewHolder,
position: Int,
payloads: MutableList<Any>
) {
bindItem(holder, position, payloads.isEmpty())
}

override fun getItemViewType(position: Int) = getItem(position).viewType()

override fun getItemId(position: Int) =
getItem(position)?.diffingId()?.hashCode()?.toLong() ?: NO_ID
getItem(position)?.diffingId()?.hashCode()?.toLong() ?: NO_ID

fun reload() {
data.value?.dataSource?.invalidate()
}

private fun bindItem(holder: RecyclerAdapterViewHolder, position: Int, firstTime: Boolean) {
getItem(position)?.castAsIn()?.bind(firstTime, holder)
?: throw IllegalStateException("Item not found")
getItem(position)?.let {
holder.setAdapter(this)
it.castAsIn().bind(firstTime, holder)
} ?: throw IllegalStateException("Item not found")
}

companion object {
val diffCallback = object : DiffUtil.ItemCallback<AdapterItem<*>>() {
override fun areItemsTheSame(oldItem: AdapterItem<*>, newItem: AdapterItem<*>) =
oldItem == newItem
override fun getAdapterItem(holder: RecyclerAdapterViewHolder): AdapterItem<*>? {
val list = currentList ?: return null
val position = holder.adapterPosition.takeIf { it >= 0 && it < list.size } ?: return null

override fun areContentsTheSame(oldItem: AdapterItem<*>, newItem: AdapterItem<*>) =
!oldItem.hasToBeReplacedBy(oldItem)
}
return list[position]
}

override fun selected(holder: RecyclerAdapterViewHolder) {
//TODO: not implemented yet
}

override fun notifyItemChanged(holder: RecyclerAdapterViewHolder) {
//TODO: not implemented yet
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ abstract class RecyclerAdapterViewHolder(itemView: View) : RecyclerView.ViewHold

private var adapter: WeakReference<RecyclerAdapterNotifier>? = null

internal fun setAdapter(recyclerAdapter: RecyclerAdapterNotifier) {
fun setAdapter(recyclerAdapter: RecyclerAdapterNotifier) {
adapter = WeakReference(recyclerAdapter)
}

Expand Down

0 comments on commit f703448

Please sign in to comment.