This commit is contained in:
Admin
2020-02-01 14:05:19 +02:00
parent 97ef9ddb48
commit d46bbda0d0
15 changed files with 56 additions and 35 deletions

View File

@@ -20,7 +20,7 @@
<category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter> </intent-filter>
</activity> </activity>
<activity android:name=".ui.main.details.MangaDetailsActivity" /> <activity android:name="org.koitharu.kotatsu.ui.details.MangaDetailsActivity" />
</application> </application>
</manifest> </manifest>

View File

@@ -5,7 +5,7 @@ import androidx.recyclerview.widget.RecyclerView
import org.koin.core.KoinComponent import org.koin.core.KoinComponent
import org.koitharu.kotatsu.utils.ext.replaceWith 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>>(), RecyclerView.Adapter<BaseViewHolder<T>>(),
KoinComponent { KoinComponent {
@@ -65,13 +65,7 @@ abstract class BaseRecyclerAdapter<T>(private val onItemClickListener: ((T) -> U
final override fun getItemCount() = dataSet.size final override fun getItemCount() = dataSet.size
final override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder<T> { final override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder<T> {
return onCreateViewHolder(parent).also { holder -> return onCreateViewHolder(parent).setOnItemClickListener(onItemClickListener).also(this::onViewHolderCreated)
if (onItemClickListener != null) {
holder.itemView.setOnClickListener {
onItemClickListener.invoke(holder.requireData())
}
}
}.also(this::onViewHolderCreated)
} }
protected open fun onViewHolderCreated(holder: BaseViewHolder<T>) = Unit protected open fun onViewHolderCreated(holder: BaseViewHolder<T>) = Unit

View File

@@ -28,5 +28,17 @@ abstract class BaseViewHolder<T> protected constructor(view: View) :
fun requireData() = boundData ?: throw IllegalStateException("Calling requireData() before bind()") 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) abstract fun onBind(data: T)
} }

View File

@@ -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
}

View File

@@ -1,4 +1,4 @@
package org.koitharu.kotatsu.ui.main.details package org.koitharu.kotatsu.ui.details
import android.view.ViewGroup import android.view.ViewGroup
import kotlinx.android.synthetic.main.item_chapter.* import kotlinx.android.synthetic.main.item_chapter.*

View File

@@ -1,11 +1,12 @@
package org.koitharu.kotatsu.ui.main.details package org.koitharu.kotatsu.ui.details
import android.view.ViewGroup import android.view.ViewGroup
import org.koitharu.kotatsu.core.model.Manga
import org.koitharu.kotatsu.core.model.MangaChapter import org.koitharu.kotatsu.core.model.MangaChapter
import org.koitharu.kotatsu.ui.common.list.BaseRecyclerAdapter 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) { BaseRecyclerAdapter<MangaChapter>(onItemClickListener) {
override fun onCreateViewHolder(parent: ViewGroup) = ChapterHolder(parent) override fun onCreateViewHolder(parent: ViewGroup) = ChapterHolder(parent)

View File

@@ -1,4 +1,4 @@
package org.koitharu.kotatsu.ui.main.details package org.koitharu.kotatsu.ui.details
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
@@ -9,9 +9,12 @@ import kotlinx.android.synthetic.main.fragment_chapters.*
import moxy.ktx.moxyPresenter import moxy.ktx.moxyPresenter
import org.koitharu.kotatsu.R import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.core.model.Manga 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.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") @Suppress("unused")
private val presenter by moxyPresenter { (activity as MangaDetailsActivity).presenter } 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?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
adapter = ChaptersAdapter { adapter = ChaptersAdapter(this)
}
recyclerView_chapters.addItemDecoration(DividerItemDecoration(view.context, RecyclerView.VERTICAL)) recyclerView_chapters.addItemDecoration(DividerItemDecoration(view.context, RecyclerView.VERTICAL))
recyclerView_chapters.adapter = adapter recyclerView_chapters.adapter = adapter
} }
@@ -38,4 +39,8 @@ class ChaptersFragment : BaseFragment(R.layout.fragment_chapters), MangaDetailsV
override fun onError(e: Exception) { override fun onError(e: Exception) {
} }
override fun onItemClick(item: MangaChapter, position: Int, view: View) {
//TODO
}
} }

View File

@@ -1,11 +1,9 @@
package org.koitharu.kotatsu.ui.main.details package org.koitharu.kotatsu.ui.details
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import androidx.viewpager.widget.ViewPager
import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar
import com.google.android.material.tabs.TabLayout
import kotlinx.android.synthetic.main.activity_details.* import kotlinx.android.synthetic.main.activity_details.*
import moxy.ktx.moxyPresenter import moxy.ktx.moxyPresenter
import org.koitharu.kotatsu.R import org.koitharu.kotatsu.R

View File

@@ -1,10 +1,9 @@
package org.koitharu.kotatsu.ui.main.details package org.koitharu.kotatsu.ui.details
import android.content.res.Resources import android.content.res.Resources
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentPagerAdapter import androidx.fragment.app.FragmentPagerAdapter
import androidx.viewpager2.adapter.FragmentStateAdapter
import org.koitharu.kotatsu.R import org.koitharu.kotatsu.R
class MangaDetailsAdapter(private val resources: Resources, fm: FragmentManager) : FragmentPagerAdapter(fm, FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { class MangaDetailsAdapter(private val resources: Resources, fm: FragmentManager) : FragmentPagerAdapter(fm, FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {

View File

@@ -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 androidx.core.view.isVisible
import coil.api.load import coil.api.load
import kotlinx.android.synthetic.main.fragment_details.* import kotlinx.android.synthetic.main.fragment_details.*
import moxy.ktx.moxyPresenter import moxy.ktx.moxyPresenter
import org.koin.core.get
import org.koitharu.kotatsu.R import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.core.model.Manga import org.koitharu.kotatsu.core.model.Manga
import org.koitharu.kotatsu.ui.common.BaseFragment import org.koitharu.kotatsu.ui.common.BaseFragment

View File

@@ -1,4 +1,4 @@
package org.koitharu.kotatsu.ui.main.details package org.koitharu.kotatsu.ui.details
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch

View File

@@ -1,4 +1,4 @@
package org.koitharu.kotatsu.ui.main.details package org.koitharu.kotatsu.ui.details
import moxy.MvpView import moxy.MvpView
import moxy.viewstate.strategy.AddToEndSingleStrategy import moxy.viewstate.strategy.AddToEndSingleStrategy

View File

@@ -4,8 +4,9 @@ import android.view.ViewGroup
import org.koitharu.kotatsu.core.model.Manga import org.koitharu.kotatsu.core.model.Manga
import org.koitharu.kotatsu.core.prefs.ListMode import org.koitharu.kotatsu.core.prefs.ListMode
import org.koitharu.kotatsu.ui.common.list.BaseRecyclerAdapter 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) { BaseRecyclerAdapter<Manga>(onItemClickListener) {
var listMode: ListMode = ListMode.LIST var listMode: ListMode = ListMode.LIST

View File

@@ -19,13 +19,14 @@ import org.koitharu.kotatsu.core.model.Manga
import org.koitharu.kotatsu.core.model.MangaSource import org.koitharu.kotatsu.core.model.MangaSource
import org.koitharu.kotatsu.core.prefs.ListMode import org.koitharu.kotatsu.core.prefs.ListMode
import org.koitharu.kotatsu.ui.common.BaseFragment 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.PaginationScrollListener
import org.koitharu.kotatsu.ui.common.list.SpacingItemDecoration 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.* import org.koitharu.kotatsu.utils.ext.*
class MangaListFragment : BaseFragment(R.layout.fragment_list), MangaListView, class MangaListFragment : BaseFragment(R.layout.fragment_list), MangaListView,
PaginationScrollListener.Callback { PaginationScrollListener.Callback, OnRecyclerItemClickListener<Manga> {
private val presenter by moxyPresenter(factory = ::MangaListPresenter) 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?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
adapter = MangaListAdapter { adapter = MangaListAdapter(this)
startActivity(MangaDetailsActivity.newIntent(context ?: return@MangaListAdapter, it))
}
initListMode(settings.listMode) initListMode(settings.listMode)
recyclerView.adapter = adapter recyclerView.adapter = adapter
recyclerView.addOnScrollListener(PaginationScrollListener(4, this)) recyclerView.addOnScrollListener(PaginationScrollListener(4, this))
@@ -75,6 +74,10 @@ class MangaListFragment : BaseFragment(R.layout.fragment_list), MangaListView,
else -> super.onOptionsItemSelected(item) else -> super.onOptionsItemSelected(item)
} }
override fun onItemClick(item: Manga, position: Int, view: View) {
startActivity(MangaDetailsActivity.newIntent(context ?: return, item))
}
override fun onRequestMoreItems(offset: Int) { override fun onRequestMoreItems(offset: Int) {
presenter.loadList(source, offset) presenter.loadList(source, offset)
} }

View File

@@ -4,7 +4,7 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
tools:context=".ui.main.details.MangaDetailsActivity"> tools:context=".ui.details.MangaDetailsActivity">
<com.google.android.material.appbar.AppBarLayout <com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent" android:layout_width="match_parent"