Revert ViewPager2 library

This commit is contained in:
arkon 2020-07-19 21:33:19 -04:00
parent cede590696
commit 08dc57fd02
5 changed files with 89 additions and 34 deletions

View File

@ -143,7 +143,6 @@ dependencies {
implementation 'androidx.preference:preference:1.1.1' implementation 'androidx.preference:preference:1.1.1'
implementation 'androidx.recyclerview:recyclerview:1.2.0-alpha04' implementation 'androidx.recyclerview:recyclerview:1.2.0-alpha04'
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0' implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'
implementation "androidx.viewpager2:viewpager2:1.0.0"
implementation 'androidx.webkit:webkit:1.3.0-rc01' implementation 'androidx.webkit:webkit:1.3.0-rc01'
final lifecycle_version = '2.3.0-alpha05' final lifecycle_version = '2.3.0-alpha05'
@ -236,6 +235,7 @@ dependencies {
implementation 'eu.davidea:flexible-adapter:5.1.0' implementation 'eu.davidea:flexible-adapter:5.1.0'
implementation 'eu.davidea:flexible-adapter-ui:1.0.0' implementation 'eu.davidea:flexible-adapter-ui:1.0.0'
implementation 'com.nononsenseapps:filepicker:2.5.2' implementation 'com.nononsenseapps:filepicker:2.5.2'
implementation 'com.nightlynexus.viewstatepageradapter:viewstatepageradapter:1.1.0'
implementation 'com.github.mthli:Slice:v1.3' implementation 'com.github.mthli:Slice:v1.3'
implementation 'com.github.chrisbanes:PhotoView:2.3.0' implementation 'com.github.chrisbanes:PhotoView:2.3.0'
implementation 'com.github.carlosesco:DirectionalViewPager:a844dbca0a' implementation 'com.github.carlosesco:DirectionalViewPager:a844dbca0a'
@ -259,7 +259,7 @@ dependencies {
implementation "io.github.reactivecircus.flowbinding:flowbinding-appcompat:$flowbinding_version" implementation "io.github.reactivecircus.flowbinding:flowbinding-appcompat:$flowbinding_version"
implementation "io.github.reactivecircus.flowbinding:flowbinding-recyclerview:$flowbinding_version" implementation "io.github.reactivecircus.flowbinding:flowbinding-recyclerview:$flowbinding_version"
implementation "io.github.reactivecircus.flowbinding:flowbinding-swiperefreshlayout:$flowbinding_version" implementation "io.github.reactivecircus.flowbinding:flowbinding-swiperefreshlayout:$flowbinding_version"
implementation "io.github.reactivecircus.flowbinding:flowbinding-viewpager2:$flowbinding_version" implementation "io.github.reactivecircus.flowbinding:flowbinding-viewpager:$flowbinding_version"
// Licenses // Licenses
final aboutlibraries_version = '8.2.0' final aboutlibraries_version = '8.2.0'

View File

@ -1,20 +1,18 @@
package eu.kanade.tachiyomi.ui.library package eu.kanade.tachiyomi.ui.library
import android.content.Context
import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.database.models.Category import eu.kanade.tachiyomi.data.database.models.Category
import eu.kanade.tachiyomi.databinding.LibraryCategoryBinding import eu.kanade.tachiyomi.util.view.inflate
import eu.kanade.tachiyomi.widget.RecyclerViewPagerAdapter
/** /**
* This adapter stores the categories from the library, used with a ViewPager. * This adapter stores the categories from the library, used with a ViewPager.
*
* @constructor creates an instance of the adapter.
*/ */
class LibraryAdapter( class LibraryAdapter(private val controller: LibraryController) : RecyclerViewPagerAdapter() {
private val context: Context,
private val controller: LibraryController
) : RecyclerView.Adapter<LibraryAdapter.ViewHolder>() {
/** /**
* The categories to bind in the adapter. * The categories to bind in the adapter.
@ -30,25 +28,45 @@ class LibraryAdapter(
private var boundViews = arrayListOf<View>() private var boundViews = arrayListOf<View>()
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { /**
val binding = LibraryCategoryBinding.inflate(LayoutInflater.from(context), parent, false) * Creates a new view for this adapter.
binding.root.onCreate(controller) *
return ViewHolder(binding) * @return a new view.
*/
override fun createView(container: ViewGroup): View {
val view = container.inflate(R.layout.library_category) as LibraryCategoryView
view.onCreate(controller)
return view
} }
override fun onBindViewHolder(holder: ViewHolder, position: Int) { /**
val view = (holder.itemView as LibraryCategoryView) * Binds a view with a position.
view.onBind(categories[position]) *
* @param view the view to bind.
* @param position the position in the adapter.
*/
override fun bindView(view: View, position: Int) {
(view as LibraryCategoryView).onBind(categories[position])
boundViews.add(view) boundViews.add(view)
} }
override fun onViewRecycled(holder: ViewHolder) { /**
val view = (holder.itemView as LibraryCategoryView) * Recycles a view.
view.onRecycle() *
* @param view the view to recycle.
* @param position the position in the adapter.
*/
override fun recycleView(view: View, position: Int) {
(view as LibraryCategoryView).onRecycle()
boundViews.remove(view) boundViews.remove(view)
} }
override fun getItemCount(): Int { /**
* Returns the number of categories.
*
* @return the number of categories or 0 if the list is null.
*/
override fun getCount(): Int {
return categories.size return categories.size
} }
@ -58,10 +76,19 @@ class LibraryAdapter(
* @param position the position of the element. * @param position the position of the element.
* @return the title to display. * @return the title to display.
*/ */
fun getPageTitle(position: Int): CharSequence { override fun getPageTitle(position: Int): CharSequence {
return categories[position].name return categories[position].name
} }
/**
* Returns the position of the view.
*/
override fun getItemPosition(obj: Any): Int {
val view = obj as? LibraryCategoryView ?: return POSITION_NONE
val index = categories.indexOfFirst { it.id == view.category.id }
return if (index == -1) POSITION_NONE else index
}
/** /**
* Called when the view of this adapter is being destroyed. * Called when the view of this adapter is being destroyed.
*/ */
@ -72,6 +99,4 @@ class LibraryAdapter(
} }
} }
} }
class ViewHolder(binding: LibraryCategoryBinding) : RecyclerView.ViewHolder(binding.root)
} }

View File

@ -15,7 +15,6 @@ import androidx.core.graphics.drawable.DrawableCompat
import com.bluelinelabs.conductor.ControllerChangeHandler import com.bluelinelabs.conductor.ControllerChangeHandler
import com.bluelinelabs.conductor.ControllerChangeType import com.bluelinelabs.conductor.ControllerChangeType
import com.google.android.material.tabs.TabLayout import com.google.android.material.tabs.TabLayout
import com.google.android.material.tabs.TabLayoutMediator
import com.jakewharton.rxrelay.BehaviorRelay import com.jakewharton.rxrelay.BehaviorRelay
import com.jakewharton.rxrelay.PublishRelay import com.jakewharton.rxrelay.PublishRelay
import com.tfcporciuncula.flow.Preference import com.tfcporciuncula.flow.Preference
@ -46,7 +45,7 @@ import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onEach
import reactivecircus.flowbinding.android.view.clicks import reactivecircus.flowbinding.android.view.clicks
import reactivecircus.flowbinding.appcompat.queryTextChanges import reactivecircus.flowbinding.appcompat.queryTextChanges
import reactivecircus.flowbinding.viewpager2.pageSelections import reactivecircus.flowbinding.viewpager.pageSelections
import rx.Subscription import rx.Subscription
import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get import uy.kohesive.injekt.api.get
@ -165,8 +164,7 @@ class LibraryController(
override fun onViewCreated(view: View) { override fun onViewCreated(view: View) {
super.onViewCreated(view) super.onViewCreated(view)
adapter = LibraryAdapter(activity!!, this) adapter = LibraryAdapter(this)
binding.libraryPager.offscreenPageLimit = 5
binding.libraryPager.adapter = adapter binding.libraryPager.adapter = adapter
binding.libraryPager.pageSelections() binding.libraryPager.pageSelections()
.onEach { .onEach {
@ -214,11 +212,7 @@ class LibraryController(
override fun onChangeStarted(handler: ControllerChangeHandler, type: ControllerChangeType) { override fun onChangeStarted(handler: ControllerChangeHandler, type: ControllerChangeType) {
super.onChangeStarted(handler, type) super.onChangeStarted(handler, type)
if (type.isEnter) { if (type.isEnter) {
activity?.tabs?.let { tabLayout -> activity?.tabs?.setupWithViewPager(binding.libraryPager)
TabLayoutMediator(tabLayout, binding.libraryPager) { tab, position ->
tab.text = adapter?.getPageTitle(position)
}.attach()
}
presenter.subscribeLibrary() presenter.subscribeLibrary()
} }
} }
@ -339,8 +333,10 @@ class LibraryController(
val position = binding.libraryPager.currentItem val position = binding.libraryPager.currentItem
adapter.recycle = false
binding.libraryPager.adapter = adapter binding.libraryPager.adapter = adapter
binding.libraryPager.currentItem = position binding.libraryPager.currentItem = position
adapter.recycle = true
} }
/** /**

View File

@ -0,0 +1,34 @@
package eu.kanade.tachiyomi.widget
import android.view.View
import android.view.ViewGroup
import com.nightlynexus.viewstatepageradapter.ViewStatePagerAdapter
import java.util.Stack
abstract class RecyclerViewPagerAdapter : ViewStatePagerAdapter() {
private val pool = Stack<View>()
var recycle = true
set(value) {
if (!value) pool.clear()
field = value
}
protected abstract fun createView(container: ViewGroup): View
protected abstract fun bindView(view: View, position: Int)
protected open fun recycleView(view: View, position: Int) {}
override fun createView(container: ViewGroup, position: Int): View {
val view = if (pool.isNotEmpty()) pool.pop() else createView(container)
bindView(view, position)
return view
}
override fun destroyView(container: ViewGroup, position: Int, view: View) {
recycleView(view, position)
if (recycle) pool.push(view)
}
}

View File

@ -39,7 +39,7 @@
tools:text="Search" tools:text="Search"
tools:visibility="visible" /> tools:visibility="visible" />
<androidx.viewpager2.widget.ViewPager2 <androidx.viewpager.widget.ViewPager
android:id="@+id/library_pager" android:id="@+id/library_pager"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" /> android:layout_height="match_parent" />