Skip to content

Instantly share code, notes, and snippets.

@keima
Last active March 31, 2024 21:58
Show Gist options
  • Select an option

  • Save keima/1b8cda30aec8cd50fec7743d2ccfa777 to your computer and use it in GitHub Desktop.

Select an option

Save keima/1b8cda30aec8cd50fec7743d2ccfa777 to your computer and use it in GitHub Desktop.

Revisions

  1. keima revised this gist Oct 23, 2019. 4 changed files with 96 additions and 20 deletions.
    75 changes: 75 additions & 0 deletions HowToUseActivity.kt
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,75 @@
    import android.os.Bundle
    import android.util.Log
    import android.view.ViewGroup
    import android.widget.TextView
    import androidx.appcompat.app.AppCompatActivity
    import androidx.databinding.DataBindingUtil
    import androidx.lifecycle.Lifecycle
    import androidx.lifecycle.LifecycleObserver
    import androidx.lifecycle.OnLifecycleEvent
    import app.keima.android.recyclerviewsandbox.databinding.ActivityMainBinding

    class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = DataBindingUtil.setContentView(this, R.layout.activity_main)

    binding.recyclerView.apply {
    adapter = MyAdapter(
    arrayOf(
    "A", "B", "C", "D",
    "A", "B", "C", "D",
    "A", "B", "C", "D",
    "A", "B", "C", "D"
    )
    )
    }
    }
    }

    class MyAdapter(private val dataset: Array<String>) :
    LifecycleRecyclerAdapter<MyAdapter.MyViewHolder>() {

    class MyViewHolder(private val textView: TextView) : LifecycleViewHolder(textView) {
    private val observer = MyObserver()

    init {
    lifecycle.addObserver(observer)
    }

    fun bindData(data: String) {
    textView.text = data
    observer.data = data
    }
    }

    class MyObserver() : LifecycleObserver {
    var data: String = "?"

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    fun onCreate() {
    Log.d("MyObserver", "appear: $data")
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    fun onDestroy() {
    Log.d("MyObserver", "disappear: $data")
    }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
    return MyViewHolder(TextView(parent.context).apply {
    setPadding(8, 40, 8, 40)
    })
    }

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
    holder.bindData("${dataset[position]} $position")
    }

    override fun getItemCount() = dataset.size

    }
    1 change: 1 addition & 0 deletions Licenses.md
    Original file line number Diff line number Diff line change
    @@ -0,0 +1 @@
    This gist snippet is [Public Domain](https://wiki.creativecommons.org/wiki/Public_domain).
    2 changes: 1 addition & 1 deletion LifecycleRecyclerAdapter.kt
    Original file line number Diff line number Diff line change
    @@ -1,4 +1,4 @@
    import android.support.v7.widget.RecyclerView
    import androidx.recyclerview.widget.RecyclerView

    abstract class LifecycleRecyclerAdapter<T : LifecycleViewHolder> : RecyclerView.Adapter<T>() {

    38 changes: 19 additions & 19 deletions LifecycleViewHolder.kt
    Original file line number Diff line number Diff line change
    @@ -1,28 +1,28 @@
    import android.arch.lifecycle.Lifecycle
    import android.arch.lifecycle.LifecycleOwner
    import android.arch.lifecycle.LifecycleRegistry
    import android.support.v7.widget.RecyclerView
    import android.view.View
    import androidx.lifecycle.Lifecycle
    import androidx.lifecycle.LifecycleOwner
    import androidx.lifecycle.LifecycleRegistry
    import androidx.recyclerview.widget.RecyclerView

    abstract class LifecycleViewHolder(itemView: View) : RecyclerView.ViewHolder(
    itemView), LifecycleOwner {
    abstract class LifecycleViewHolder(itemView: View) :
    RecyclerView.ViewHolder(itemView), LifecycleOwner {

    private val lifecycleRegistry = LifecycleRegistry(this)
    private val lifecycleRegistry = LifecycleRegistry(this)

    init {
    lifecycleRegistry.markState(Lifecycle.State.INITIALIZED)
    }
    init {
    lifecycleRegistry.currentState = Lifecycle.State.INITIALIZED
    }

    fun onAppear() {
    lifecycleRegistry.markState(Lifecycle.State.CREATED)
    }
    fun onAppear() {
    lifecycleRegistry.currentState = Lifecycle.State.CREATED
    }

    fun onDisappear() {
    lifecycleRegistry.markState(Lifecycle.State.DESTROYED)
    }
    fun onDisappear() {
    lifecycleRegistry.currentState = Lifecycle.State.DESTROYED
    }

    override fun getLifecycle(): Lifecycle {
    return lifecycleRegistry
    }
    override fun getLifecycle(): Lifecycle {
    return lifecycleRegistry
    }

    }
  2. keima created this gist Apr 10, 2018.
    15 changes: 15 additions & 0 deletions LifecycleRecyclerAdapter.kt
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,15 @@
    import android.support.v7.widget.RecyclerView

    abstract class LifecycleRecyclerAdapter<T : LifecycleViewHolder> : RecyclerView.Adapter<T>() {

    override fun onViewAttachedToWindow(holder: T) {
    super.onViewAttachedToWindow(holder)
    holder.onAppear()
    }

    override fun onViewDetachedFromWindow(holder: T) {
    super.onViewDetachedFromWindow(holder)
    holder.onDisappear()
    }

    }
    28 changes: 28 additions & 0 deletions LifecycleViewHolder.kt
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,28 @@
    import android.arch.lifecycle.Lifecycle
    import android.arch.lifecycle.LifecycleOwner
    import android.arch.lifecycle.LifecycleRegistry
    import android.support.v7.widget.RecyclerView
    import android.view.View

    abstract class LifecycleViewHolder(itemView: View) : RecyclerView.ViewHolder(
    itemView), LifecycleOwner {

    private val lifecycleRegistry = LifecycleRegistry(this)

    init {
    lifecycleRegistry.markState(Lifecycle.State.INITIALIZED)
    }

    fun onAppear() {
    lifecycleRegistry.markState(Lifecycle.State.CREATED)
    }

    fun onDisappear() {
    lifecycleRegistry.markState(Lifecycle.State.DESTROYED)
    }

    override fun getLifecycle(): Lifecycle {
    return lifecycleRegistry
    }

    }