feat: 调整视图与数据分离
This commit is contained in:
@@ -1,28 +1,41 @@
|
|||||||
package io.legado.app.ui.book.remote
|
package io.legado.app.ui.book.remote
|
||||||
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
|
import android.util.Log
|
||||||
import androidx.activity.viewModels
|
import androidx.activity.viewModels
|
||||||
|
import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
import io.legado.app.base.VMBaseActivity
|
import io.legado.app.base.VMBaseActivity
|
||||||
|
import io.legado.app.data.entities.Book
|
||||||
|
|
||||||
|
|
||||||
import io.legado.app.databinding.ActivityRemoteBookBinding
|
import io.legado.app.databinding.ActivityRemoteBookBinding
|
||||||
|
import io.legado.app.lib.theme.backgroundColor
|
||||||
import io.legado.app.utils.toastOnUi
|
import io.legado.app.utils.toastOnUi
|
||||||
|
|
||||||
import io.legado.app.utils.viewbindingdelegate.viewBinding
|
import io.legado.app.utils.viewbindingdelegate.viewBinding
|
||||||
|
import kotlinx.coroutines.flow.conflate
|
||||||
|
import kotlinx.coroutines.launch
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 展示远程书籍
|
* 展示远程书籍
|
||||||
* @author qianfanguojin
|
* @author qianfanguojin
|
||||||
* @time 2022/05/12
|
* @time 2022/05/12
|
||||||
*/
|
*/
|
||||||
class RemoteBookActivity : VMBaseActivity<ActivityRemoteBookBinding,RemoteBookViewModel>() {
|
class RemoteBookActivity : VMBaseActivity<ActivityRemoteBookBinding,RemoteBookViewModel>(),
|
||||||
|
RemoteBookAdapter.CallBack {
|
||||||
override val binding by viewBinding(ActivityRemoteBookBinding::inflate)
|
override val binding by viewBinding(ActivityRemoteBookBinding::inflate)
|
||||||
override val viewModel by viewModels<RemoteBookViewModel>()
|
override val viewModel by viewModels<RemoteBookViewModel>()
|
||||||
|
private val adapter by lazy { RemoteBookAdapter(this, this) }
|
||||||
|
|
||||||
override fun onActivityCreated(savedInstanceState: Bundle?) {
|
override fun onActivityCreated(savedInstanceState: Bundle?) {
|
||||||
toastOnUi("远程书籍")
|
initView()
|
||||||
|
initData()
|
||||||
|
// toastOnUi("远程书籍")
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun initView() {
|
private fun initView() {
|
||||||
|
binding.recyclerView.layoutManager = LinearLayoutManager(this)
|
||||||
|
binding.recyclerView.adapter = adapter
|
||||||
// binding.layTop.setBackgroundColor(backgroundColor)
|
// binding.layTop.setBackgroundColor(backgroundColor)
|
||||||
// binding.recyclerView.layoutManager = LinearLayoutManager(this)
|
// binding.recyclerView.layoutManager = LinearLayoutManager(this)
|
||||||
// binding.recyclerView.adapter = adapter
|
// binding.recyclerView.adapter = adapter
|
||||||
@@ -31,4 +44,24 @@ class RemoteBookActivity : VMBaseActivity<ActivityRemoteBookBinding,RemoteBookVi
|
|||||||
// binding.selectActionBar.setOnMenuItemClickListener(this)
|
// binding.selectActionBar.setOnMenuItemClickListener(this)
|
||||||
// binding.selectActionBar.setCallBack(this)
|
// binding.selectActionBar.setCallBack(this)
|
||||||
}
|
}
|
||||||
|
private fun initData() {
|
||||||
|
// viewModel.getRemoteBooks().observe(this, {
|
||||||
|
// adapter.submitList(it)
|
||||||
|
// })
|
||||||
|
|
||||||
|
|
||||||
|
launch {
|
||||||
|
Log.e("TAG", "2")
|
||||||
|
viewModel.dataFlow.conflate().collect { remoteBooks ->
|
||||||
|
adapter.setItems(remoteBooks)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// toastOnUi("1")
|
||||||
|
viewModel.loadRemoteBookList()
|
||||||
|
}
|
||||||
|
override fun showRemoteBookInfo(book: Book) {
|
||||||
|
TODO("Not yet implemented")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
package io.legado.app.ui.book.remote
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import io.legado.app.base.adapter.ItemViewHolder
|
||||||
|
import io.legado.app.base.adapter.RecyclerAdapter
|
||||||
|
import io.legado.app.data.entities.Book
|
||||||
|
import io.legado.app.databinding.ItemRemoteBookBinding
|
||||||
|
|
||||||
|
|
||||||
|
class RemoteBookAdapter (context: Context, val callBack: CallBack) :
|
||||||
|
RecyclerAdapter<String, ItemRemoteBookBinding>(context){
|
||||||
|
|
||||||
|
override fun getViewBinding(parent: ViewGroup): ItemRemoteBookBinding {
|
||||||
|
return ItemRemoteBookBinding.inflate(inflater, parent, false)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onCurrentListChanged() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 绑定RecycleView 中每一个项的视图和数据
|
||||||
|
*/
|
||||||
|
override fun convert(
|
||||||
|
holder: ItemViewHolder,
|
||||||
|
binding: ItemRemoteBookBinding,
|
||||||
|
item: String,
|
||||||
|
payloads: MutableList<Any>
|
||||||
|
) {
|
||||||
|
binding.run {
|
||||||
|
tvName.text = item
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun registerListener(holder: ItemViewHolder, binding: ItemRemoteBookBinding) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
interface CallBack {
|
||||||
|
fun showRemoteBookInfo(book: Book)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,7 +1,68 @@
|
|||||||
package io.legado.app.ui.book.remote
|
package io.legado.app.ui.book.remote
|
||||||
|
|
||||||
import android.app.Application
|
import android.app.Application
|
||||||
|
import android.util.Log
|
||||||
|
import android.widget.Toast
|
||||||
import io.legado.app.base.BaseViewModel
|
import io.legado.app.base.BaseViewModel
|
||||||
|
import io.legado.app.utils.FileDoc
|
||||||
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
import kotlinx.coroutines.channels.awaitClose
|
||||||
|
import kotlinx.coroutines.flow.callbackFlow
|
||||||
|
import kotlinx.coroutines.flow.flowOn
|
||||||
|
import kotlinx.coroutines.flow.map
|
||||||
|
import kotlinx.coroutines.withContext
|
||||||
|
import java.util.*
|
||||||
|
import kotlin.reflect.typeOf
|
||||||
|
|
||||||
class RemoteBookViewModel(application: Application): BaseViewModel(application){
|
class RemoteBookViewModel(application: Application): BaseViewModel(application){
|
||||||
|
|
||||||
|
private var dataCallback : DataCallback? = null
|
||||||
|
var dataFlowStart: (() -> Unit)? = null
|
||||||
|
val dataFlow = callbackFlow<List<String>> {
|
||||||
|
|
||||||
|
val list = Collections.synchronizedList(ArrayList<String>())
|
||||||
|
|
||||||
|
dataCallback = object : DataCallback {
|
||||||
|
|
||||||
|
override fun setItems(remoteFiles: List<String>) {
|
||||||
|
list.clear()
|
||||||
|
list.addAll(remoteFiles)
|
||||||
|
Log.e("TAG", ": 1", )
|
||||||
|
trySend(list)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun addItems(remoteFiles: List<String>) {
|
||||||
|
list.addAll(remoteFiles)
|
||||||
|
trySend(list)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun clear() {
|
||||||
|
list.clear()
|
||||||
|
trySend(emptyList())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// withContext(Dispatchers.Main) {
|
||||||
|
// dataFlowStart?.invoke()
|
||||||
|
// }
|
||||||
|
|
||||||
|
awaitClose {
|
||||||
|
dataCallback = null
|
||||||
|
}
|
||||||
|
}.flowOn(Dispatchers.Main)
|
||||||
|
|
||||||
|
fun loadRemoteBookList() {
|
||||||
|
Log.e("TAG", dataCallback.toString(), )
|
||||||
|
dataCallback?.setItems(listOf("1", "2", "3"))
|
||||||
|
}
|
||||||
|
|
||||||
|
interface DataCallback {
|
||||||
|
|
||||||
|
fun setItems(remoteFiles: List<String>)
|
||||||
|
|
||||||
|
fun addItems(remoteFiles: List<String>)
|
||||||
|
|
||||||
|
fun clear()
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -16,10 +16,24 @@
|
|||||||
<!-- android:layout_width="match_parent"-->
|
<!-- android:layout_width="match_parent"-->
|
||||||
<!-- android:layout_height="2dp"-->
|
<!-- android:layout_height="2dp"-->
|
||||||
<!-- app:layout_constraintTop_toBottomOf="@id/lay_top" />-->
|
<!-- app:layout_constraintTop_toBottomOf="@id/lay_top" />-->
|
||||||
|
<io.legado.app.ui.widget.anima.RefreshProgressBar
|
||||||
<androidx.recyclerview.widget.RecyclerView
|
android:id="@+id/refresh_progress_bar"
|
||||||
android:id="@+id/recycler_view"
|
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent" />
|
android:layout_height="2dp"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/titleBar" />
|
||||||
|
|
||||||
|
<io.legado.app.ui.widget.dynamiclayout.DynamicFrameLayout
|
||||||
|
android:id="@+id/content_view"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="0dp"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/refresh_progress_bar">
|
||||||
|
|
||||||
|
<androidx.recyclerview.widget.RecyclerView
|
||||||
|
android:id="@+id/recycler_view"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent" />
|
||||||
|
|
||||||
|
</io.legado.app.ui.widget.dynamiclayout.DynamicFrameLayout>
|
||||||
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
@@ -0,0 +1,91 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content">
|
||||||
|
|
||||||
|
<io.legado.app.ui.widget.image.CoverImageView
|
||||||
|
android:id="@+id/iv_cover"
|
||||||
|
android:layout_width="80dp"
|
||||||
|
android:layout_height="110dp"
|
||||||
|
android:layout_margin="8dp"
|
||||||
|
android:contentDescription="@string/img_cover"
|
||||||
|
android:scaleType="centerCrop"
|
||||||
|
android:src="@drawable/image_cover_default"
|
||||||
|
android:transitionName="img_cover"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintLeft_toLeftOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
tools:ignore="UnusedAttribute" />
|
||||||
|
|
||||||
|
<io.legado.app.ui.widget.text.BadgeView
|
||||||
|
android:id="@+id/bv_originCount"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_margin="8dp"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
app:layout_constraintRight_toRightOf="parent" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tv_name"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_margin="8dp"
|
||||||
|
android:singleLine="true"
|
||||||
|
android:text="@string/app_name"
|
||||||
|
android:textColor="@color/primaryText"
|
||||||
|
android:textSize="16sp"
|
||||||
|
app:layout_constraintEnd_toStartOf="@id/bv_originCount"
|
||||||
|
app:layout_constraintStart_toEndOf="@+id/iv_cover"
|
||||||
|
app:layout_constraintTop_toTopOf="parent" />
|
||||||
|
|
||||||
|
<!-- <LinearLayout-->
|
||||||
|
<!-- android:layout_width="0dp"-->
|
||||||
|
<!-- android:layout_height="0dp"-->
|
||||||
|
<!-- android:orientation="vertical"-->
|
||||||
|
<!-- android:layout_marginTop="3dp"-->
|
||||||
|
<!-- app:layout_constraintBottom_toBottomOf="@id/iv_cover"-->
|
||||||
|
<!-- app:layout_constraintLeft_toLeftOf="@+id/tv_name"-->
|
||||||
|
<!-- app:layout_constraintRight_toRightOf="@id/tv_name"-->
|
||||||
|
<!-- app:layout_constraintTop_toBottomOf="@+id/tv_name">-->
|
||||||
|
|
||||||
|
<!-- <TextView-->
|
||||||
|
<!-- android:id="@+id/tv_author"-->
|
||||||
|
<!-- android:layout_width="match_parent"-->
|
||||||
|
<!-- android:layout_height="wrap_content"-->
|
||||||
|
<!-- android:ellipsize="end"-->
|
||||||
|
<!-- android:lines="1"-->
|
||||||
|
<!-- android:text="@string/author"-->
|
||||||
|
<!-- android:textColor="@color/primaryText"-->
|
||||||
|
<!-- android:textSize="12sp" />-->
|
||||||
|
|
||||||
|
<!-- <io.legado.app.ui.widget.LabelsBar-->
|
||||||
|
<!-- android:id="@+id/ll_kind"-->
|
||||||
|
<!-- android:layout_width="match_parent"-->
|
||||||
|
<!-- android:layout_height="wrap_content"-->
|
||||||
|
<!-- android:orientation="horizontal" />-->
|
||||||
|
|
||||||
|
<!-- <TextView-->
|
||||||
|
<!-- android:id="@+id/tv_lasted"-->
|
||||||
|
<!-- android:layout_width="match_parent"-->
|
||||||
|
<!-- android:layout_height="wrap_content"-->
|
||||||
|
<!-- android:ellipsize="end"-->
|
||||||
|
<!-- android:lines="1"-->
|
||||||
|
<!-- android:text="@string/last_read"-->
|
||||||
|
<!-- android:textColor="@color/primaryText"-->
|
||||||
|
<!-- android:textSize="12sp" />-->
|
||||||
|
|
||||||
|
<!-- <io.legado.app.ui.widget.text.MultilineTextView-->
|
||||||
|
<!-- android:id="@+id/tv_introduce"-->
|
||||||
|
<!-- android:layout_width="match_parent"-->
|
||||||
|
<!-- android:layout_height="match_parent"-->
|
||||||
|
<!-- android:ellipsize="end"-->
|
||||||
|
<!-- android:text="@string/book_intro"-->
|
||||||
|
<!-- android:textColor="@color/primaryText"-->
|
||||||
|
<!-- android:textSize="12sp" />-->
|
||||||
|
|
||||||
|
<!-- </LinearLayout>-->
|
||||||
|
|
||||||
|
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
Reference in New Issue
Block a user