Refactor
This commit is contained in:
@@ -20,7 +20,7 @@
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
<activity android:name=".ui.main.details.MangaDetailsActivity" />
|
||||
<activity android:name="org.koitharu.kotatsu.ui.details.MangaDetailsActivity" />
|
||||
</application>
|
||||
|
||||
</manifest>
|
||||
@@ -5,7 +5,7 @@ import androidx.recyclerview.widget.RecyclerView
|
||||
import org.koin.core.KoinComponent
|
||||
import org.koitharu.kotatsu.utils.ext.replaceWith
|
||||
|
||||
abstract class BaseRecyclerAdapter<T>(private val onItemClickListener: ((T) -> Unit)? = null) :
|
||||
abstract class BaseRecyclerAdapter<T>(private val onItemClickListener: OnRecyclerItemClickListener<T>? = null) :
|
||||
RecyclerView.Adapter<BaseViewHolder<T>>(),
|
||||
KoinComponent {
|
||||
|
||||
@@ -65,13 +65,7 @@ abstract class BaseRecyclerAdapter<T>(private val onItemClickListener: ((T) -> U
|
||||
final override fun getItemCount() = dataSet.size
|
||||
|
||||
final override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder<T> {
|
||||
return onCreateViewHolder(parent).also { holder ->
|
||||
if (onItemClickListener != null) {
|
||||
holder.itemView.setOnClickListener {
|
||||
onItemClickListener.invoke(holder.requireData())
|
||||
}
|
||||
}
|
||||
}.also(this::onViewHolderCreated)
|
||||
return onCreateViewHolder(parent).setOnItemClickListener(onItemClickListener).also(this::onViewHolderCreated)
|
||||
}
|
||||
|
||||
protected open fun onViewHolderCreated(holder: BaseViewHolder<T>) = Unit
|
||||
|
||||
@@ -28,5 +28,17 @@ abstract class BaseViewHolder<T> protected constructor(view: View) :
|
||||
|
||||
fun requireData() = boundData ?: throw IllegalStateException("Calling requireData() before bind()")
|
||||
|
||||
fun setOnItemClickListener(listener: OnRecyclerItemClickListener<T>?): BaseViewHolder<T> {
|
||||
if (listener != null) {
|
||||
itemView.setOnClickListener {
|
||||
listener.onItemClick(boundData ?: return@setOnClickListener, adapterPosition, it)
|
||||
}
|
||||
itemView.setOnLongClickListener {
|
||||
listener.onItemLongClick(boundData ?: return@setOnLongClickListener false, adapterPosition, it)
|
||||
}
|
||||
}
|
||||
return this
|
||||
}
|
||||
|
||||
abstract fun onBind(data: T)
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
package org.koitharu.kotatsu.ui.common.list
|
||||
|
||||
import android.view.View
|
||||
|
||||
interface OnRecyclerItemClickListener<I> {
|
||||
|
||||
fun onItemClick(item: I, position: Int, view: View)
|
||||
|
||||
fun onItemLongClick(item: I, position: Int, view: View) = false
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package org.koitharu.kotatsu.ui.main.details
|
||||
package org.koitharu.kotatsu.ui.details
|
||||
|
||||
import android.view.ViewGroup
|
||||
import kotlinx.android.synthetic.main.item_chapter.*
|
||||
@@ -1,11 +1,12 @@
|
||||
package org.koitharu.kotatsu.ui.main.details
|
||||
package org.koitharu.kotatsu.ui.details
|
||||
|
||||
import android.view.ViewGroup
|
||||
import org.koitharu.kotatsu.core.model.Manga
|
||||
import org.koitharu.kotatsu.core.model.MangaChapter
|
||||
import org.koitharu.kotatsu.ui.common.list.BaseRecyclerAdapter
|
||||
import org.koitharu.kotatsu.ui.common.list.BaseViewHolder
|
||||
import org.koitharu.kotatsu.ui.common.list.OnRecyclerItemClickListener
|
||||
|
||||
class ChaptersAdapter(onItemClickListener: ((MangaChapter) -> Unit)?) :
|
||||
class ChaptersAdapter(onItemClickListener: OnRecyclerItemClickListener<MangaChapter>) :
|
||||
BaseRecyclerAdapter<MangaChapter>(onItemClickListener) {
|
||||
|
||||
override fun onCreateViewHolder(parent: ViewGroup) = ChapterHolder(parent)
|
||||
@@ -1,4 +1,4 @@
|
||||
package org.koitharu.kotatsu.ui.main.details
|
||||
package org.koitharu.kotatsu.ui.details
|
||||
|
||||
import android.os.Bundle
|
||||
import android.view.View
|
||||
@@ -9,9 +9,12 @@ import kotlinx.android.synthetic.main.fragment_chapters.*
|
||||
import moxy.ktx.moxyPresenter
|
||||
import org.koitharu.kotatsu.R
|
||||
import org.koitharu.kotatsu.core.model.Manga
|
||||
import org.koitharu.kotatsu.core.model.MangaChapter
|
||||
import org.koitharu.kotatsu.ui.common.BaseFragment
|
||||
import org.koitharu.kotatsu.ui.common.list.OnRecyclerItemClickListener
|
||||
|
||||
class ChaptersFragment : BaseFragment(R.layout.fragment_chapters), MangaDetailsView {
|
||||
class ChaptersFragment : BaseFragment(R.layout.fragment_chapters), MangaDetailsView,
|
||||
OnRecyclerItemClickListener<MangaChapter> {
|
||||
|
||||
@Suppress("unused")
|
||||
private val presenter by moxyPresenter { (activity as MangaDetailsActivity).presenter }
|
||||
@@ -20,9 +23,7 @@ class ChaptersFragment : BaseFragment(R.layout.fragment_chapters), MangaDetailsV
|
||||
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
super.onViewCreated(view, savedInstanceState)
|
||||
adapter = ChaptersAdapter {
|
||||
|
||||
}
|
||||
adapter = ChaptersAdapter(this)
|
||||
recyclerView_chapters.addItemDecoration(DividerItemDecoration(view.context, RecyclerView.VERTICAL))
|
||||
recyclerView_chapters.adapter = adapter
|
||||
}
|
||||
@@ -38,4 +39,8 @@ class ChaptersFragment : BaseFragment(R.layout.fragment_chapters), MangaDetailsV
|
||||
override fun onError(e: Exception) {
|
||||
|
||||
}
|
||||
|
||||
override fun onItemClick(item: MangaChapter, position: Int, view: View) {
|
||||
//TODO
|
||||
}
|
||||
}
|
||||
@@ -1,11 +1,9 @@
|
||||
package org.koitharu.kotatsu.ui.main.details
|
||||
package org.koitharu.kotatsu.ui.details
|
||||
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.os.Bundle
|
||||
import androidx.viewpager.widget.ViewPager
|
||||
import com.google.android.material.snackbar.Snackbar
|
||||
import com.google.android.material.tabs.TabLayout
|
||||
import kotlinx.android.synthetic.main.activity_details.*
|
||||
import moxy.ktx.moxyPresenter
|
||||
import org.koitharu.kotatsu.R
|
||||
@@ -1,10 +1,9 @@
|
||||
package org.koitharu.kotatsu.ui.main.details
|
||||
package org.koitharu.kotatsu.ui.details
|
||||
|
||||
import android.content.res.Resources
|
||||
import androidx.fragment.app.Fragment
|
||||
import androidx.fragment.app.FragmentManager
|
||||
import androidx.fragment.app.FragmentPagerAdapter
|
||||
import androidx.viewpager2.adapter.FragmentStateAdapter
|
||||
import org.koitharu.kotatsu.R
|
||||
|
||||
class MangaDetailsAdapter(private val resources: Resources, fm: FragmentManager) : FragmentPagerAdapter(fm, FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {
|
||||
@@ -1,11 +1,9 @@
|
||||
package org.koitharu.kotatsu.ui.main.details
|
||||
package org.koitharu.kotatsu.ui.details
|
||||
|
||||
import android.os.Bundle
|
||||
import androidx.core.view.isVisible
|
||||
import coil.api.load
|
||||
import kotlinx.android.synthetic.main.fragment_details.*
|
||||
import moxy.ktx.moxyPresenter
|
||||
import org.koin.core.get
|
||||
import org.koitharu.kotatsu.R
|
||||
import org.koitharu.kotatsu.core.model.Manga
|
||||
import org.koitharu.kotatsu.ui.common.BaseFragment
|
||||
@@ -1,4 +1,4 @@
|
||||
package org.koitharu.kotatsu.ui.main.details
|
||||
package org.koitharu.kotatsu.ui.details
|
||||
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
@@ -1,4 +1,4 @@
|
||||
package org.koitharu.kotatsu.ui.main.details
|
||||
package org.koitharu.kotatsu.ui.details
|
||||
|
||||
import moxy.MvpView
|
||||
import moxy.viewstate.strategy.AddToEndSingleStrategy
|
||||
@@ -4,8 +4,9 @@ import android.view.ViewGroup
|
||||
import org.koitharu.kotatsu.core.model.Manga
|
||||
import org.koitharu.kotatsu.core.prefs.ListMode
|
||||
import org.koitharu.kotatsu.ui.common.list.BaseRecyclerAdapter
|
||||
import org.koitharu.kotatsu.ui.common.list.OnRecyclerItemClickListener
|
||||
|
||||
class MangaListAdapter(onItemClickListener: ((Manga) -> Unit)?) :
|
||||
class MangaListAdapter(onItemClickListener: OnRecyclerItemClickListener<Manga>) :
|
||||
BaseRecyclerAdapter<Manga>(onItemClickListener) {
|
||||
|
||||
var listMode: ListMode = ListMode.LIST
|
||||
|
||||
@@ -19,13 +19,14 @@ import org.koitharu.kotatsu.core.model.Manga
|
||||
import org.koitharu.kotatsu.core.model.MangaSource
|
||||
import org.koitharu.kotatsu.core.prefs.ListMode
|
||||
import org.koitharu.kotatsu.ui.common.BaseFragment
|
||||
import org.koitharu.kotatsu.ui.common.list.OnRecyclerItemClickListener
|
||||
import org.koitharu.kotatsu.ui.common.list.PaginationScrollListener
|
||||
import org.koitharu.kotatsu.ui.common.list.SpacingItemDecoration
|
||||
import org.koitharu.kotatsu.ui.main.details.MangaDetailsActivity
|
||||
import org.koitharu.kotatsu.ui.details.MangaDetailsActivity
|
||||
import org.koitharu.kotatsu.utils.ext.*
|
||||
|
||||
class MangaListFragment : BaseFragment(R.layout.fragment_list), MangaListView,
|
||||
PaginationScrollListener.Callback {
|
||||
PaginationScrollListener.Callback, OnRecyclerItemClickListener<Manga> {
|
||||
|
||||
private val presenter by moxyPresenter(factory = ::MangaListPresenter)
|
||||
|
||||
@@ -40,9 +41,7 @@ class MangaListFragment : BaseFragment(R.layout.fragment_list), MangaListView,
|
||||
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
super.onViewCreated(view, savedInstanceState)
|
||||
adapter = MangaListAdapter {
|
||||
startActivity(MangaDetailsActivity.newIntent(context ?: return@MangaListAdapter, it))
|
||||
}
|
||||
adapter = MangaListAdapter(this)
|
||||
initListMode(settings.listMode)
|
||||
recyclerView.adapter = adapter
|
||||
recyclerView.addOnScrollListener(PaginationScrollListener(4, this))
|
||||
@@ -75,6 +74,10 @@ class MangaListFragment : BaseFragment(R.layout.fragment_list), MangaListView,
|
||||
else -> super.onOptionsItemSelected(item)
|
||||
}
|
||||
|
||||
override fun onItemClick(item: Manga, position: Int, view: View) {
|
||||
startActivity(MangaDetailsActivity.newIntent(context ?: return, item))
|
||||
}
|
||||
|
||||
override fun onRequestMoreItems(offset: Int) {
|
||||
presenter.loadList(source, offset)
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:context=".ui.main.details.MangaDetailsActivity">
|
||||
tools:context=".ui.details.MangaDetailsActivity">
|
||||
|
||||
<com.google.android.material.appbar.AppBarLayout
|
||||
android:layout_width="match_parent"
|
||||
|
||||
Reference in New Issue
Block a user