Skip to content

Commit

Permalink
[代码修改] 文章列表结构优化
Browse files Browse the repository at this point in the history
  • Loading branch information
jiewang41 committed Jan 22, 2021
1 parent 45b8bb5 commit aa949f2
Show file tree
Hide file tree
Showing 26 changed files with 321 additions and 193 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ class CollectionActivity
mBinding.rvArticles.let { rv ->
rv.layoutManager = WrapContentLinearLayoutManager()
rv.adapter = mArticlesAdapter.also {
it.viewModel = viewModel.articleListEventInterface
it.viewModel = viewModel.articleListItemInterface
it.setEmptyView(R.layout.app_layout_placeholder)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ class QuestionAnswerActivity
mBinding.rvQa.let { rv ->
rv.layoutManager = WrapContentLinearLayoutManager()
rv.adapter = mArticlesAdapter.also {
it.viewModel = viewModel.articleListEventInterface
it.viewModel = viewModel.articleListItemInterface
it.setEmptyView(R.layout.app_layout_placeholder)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ class SearchActivity
mBinding.rvSearch.let { rv ->
rv.layoutManager = WrapContentLinearLayoutManager()
rv.adapter = mArticlesAdapter.also {
it.viewModel = viewModel.articleListEventInterface
it.viewModel = viewModel.articleListItemInterface
it.setEmptyView(R.layout.app_layout_placeholder)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ class SystemArticlesActivity : BaseActivity<SystemArticlesViewModel, AppActivity
mBinding.rvSystemArticles.let { rv ->
rv.layoutManager = WrapContentLinearLayoutManager()
rv.adapter = mArticlesAdapter.also {
it.viewModel = viewModel.articleListEventInterface
it.viewModel = viewModel.articleListItemInterface
it.setEmptyView(R.layout.app_layout_placeholder)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import com.wj.sampleproject.R
import com.wj.sampleproject.databinding.AppRecyclerItemArticlesBinding
import com.wj.sampleproject.entity.ArticleEntity
import com.wj.sampleproject.entity.ArticleTagEntity
import com.wj.sampleproject.interfaces.ArticleListItemInterface

/**
* 首页文章列表列表适配器类
Expand All @@ -18,7 +19,7 @@ class ArticleListRvAdapter
: BaseRvListDBAdapter<
ArticleListRvAdapter.ViewHolder,
AppRecyclerItemArticlesBinding,
ArticleListEventInterface,
ArticleListItemInterface,
ArticleEntity>() {

override val layoutResID: Int = R.layout.app_recycler_item_articles
Expand All @@ -36,17 +37,4 @@ class ArticleListRvAdapter

class ViewHolder(binding: AppRecyclerItemArticlesBinding)
: BaseRvDBViewHolder<AppRecyclerItemArticlesBinding, ArticleEntity>(binding)
}

/**
* 文章列表适配接口
* > 提供 [onArticleItemClick]、[onArticleCollectClick] 两个点击事件
*/
interface ArticleListEventInterface {

/** 文章列表条目点击 */
val onArticleItemClick: (ArticleEntity) -> Unit

/** 文章收藏点击 */
val onArticleCollectClick: (ArticleEntity) -> Unit
}
Original file line number Diff line number Diff line change
Expand Up @@ -118,4 +118,5 @@ val viewModelModule: Module = module {
viewModel { VerificationViewModel(get()) }
viewModel { BiometricViewModel() }
viewModel { QuestionAnswerViewModel(get()) }
viewModel { CoinViewModel(get()) }
}
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ class BjnewsArticlesFragment
mBinding.rvBjnewsArticles.let { rv ->
rv.layoutManager = WrapContentLinearLayoutManager()
rv.adapter = mArticlesAdapter.also {
it.viewModel = viewModel.articleListEventInterface
it.viewModel = viewModel.articleListItemInterface
it.setEmptyView(R.layout.app_layout_placeholder)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ class HomepageFragment
mBinding.rvArticles.let { rv ->
rv.layoutManager = WrapContentLinearLayoutManager()
rv.adapter = mArticlesAdapter.also {
it.viewModel = viewModel.articleListEventInterface
it.viewModel = viewModel.articleListItemInterface
it.setEmptyView(R.layout.app_layout_placeholder)
it.showHeaderWhenEmpty(true)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ class ProjectArticlesFragment
mBinding.rvProjectArticles.let { rv ->
rv.layoutManager = WrapContentLinearLayoutManager()
rv.adapter = mArticlesAdapter.also {
it.viewModel = viewModel.articleListEventInterface
it.viewModel = viewModel.articleListItemInterface
it.setEmptyView(R.layout.app_layout_placeholder)
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
package com.wj.sampleproject.interfaces

import com.wj.sampleproject.base.viewmodel.BaseViewModel
import androidx.lifecycle.MutableLiveData
import com.wj.sampleproject.entity.ArticleEntity
import com.wj.sampleproject.model.SnackbarModel

/**
* 文章收藏接口
Expand All @@ -12,11 +13,9 @@ import com.wj.sampleproject.entity.ArticleEntity
*/
interface ArticleCollectionInterface {

var viewModel: BaseViewModel
/** 收藏文章[item],使用 [snackbarData] 弹出提示 */
suspend fun collect(item: ArticleEntity, snackbarData: MutableLiveData<SnackbarModel>)

/** 收藏文章[item] */
fun collect(item: ArticleEntity)

/** 取消收藏文章[item] */
fun unCollect(item: ArticleEntity)
/** 取消收藏文章[item],使用 [snackbarData] 弹出提示 */
suspend fun unCollect(item: ArticleEntity, snackbarData: MutableLiveData<SnackbarModel>)
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.wj.sampleproject.interfaces

import com.wj.sampleproject.entity.ArticleEntity

/**
* 文章列表点击事件接口
*
* - 创建时间:2021/1/22
*
* @author 王杰
*/
interface ArticleListItemInterface {

/** 文章列表条目点击 */
val onArticleItemClick: (ArticleEntity) -> Unit

/** 文章收藏点击 */
val onArticleCollectClick: (ArticleEntity) -> Unit
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import com.wj.sampleproject.net.NetResult
*
* @author 王杰
*/
interface ArticleListPagingInterface : ArticleListInterface {
interface ArticleListPagingInterface {

/** 页码 */
val pageNumber: MutableLiveData<Int>
Expand All @@ -36,5 +36,5 @@ interface ArticleListPagingInterface : ArticleListInterface {
val onLoadMore: () -> Unit

/** 根据页码 [Int] 获取文章列表数据 */
var getArticleList: suspend (Int) -> NetResult<ArticleListEntity>
var getArticleList: (Int) -> LiveData<NetResult<ArticleListEntity>>
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
package com.wj.sampleproject.interfaces.impl

import androidx.lifecycle.viewModelScope
import androidx.lifecycle.MutableLiveData
import cn.wj.common.ext.orEmpty
import com.orhanobut.logger.Logger
import com.wj.sampleproject.base.viewmodel.BaseViewModel
import com.wj.sampleproject.entity.ArticleEntity
import com.wj.sampleproject.ext.judge
import com.wj.sampleproject.interfaces.ArticleCollectionInterface
import com.wj.sampleproject.model.SnackbarModel
import com.wj.sampleproject.repository.ArticleRepository
import com.wj.sampleproject.tools.toSnackbarModel
import kotlinx.coroutines.launch

/**
* 文章收藏接口实现类
Expand All @@ -18,51 +17,41 @@ import kotlinx.coroutines.launch
*
* @author 王杰
*/
open class ArticleCollectionInterfaceImpl(private val repository: ArticleRepository)
class ArticleCollectionInterfaceImpl(private val repository: ArticleRepository)
: ArticleCollectionInterface {

override lateinit var viewModel: BaseViewModel

/** 收藏文章[item] */
override fun collect(item: ArticleEntity) {
viewModel.run {
viewModelScope.launch {
try {
// 收藏
repository.collectArticleInside(item.id.orEmpty())
.judge(onFailed = {
// 收藏失败,提示、回滚收藏状态
snackbarData.value = this.toSnackbarModel()
item.collected.set(false)
})
} catch (throwable: Throwable) {
Logger.t("NET").e(throwable, "collect")
// 收藏失败,提示、回滚收藏状态
snackbarData.value = throwable.toSnackbarModel()
item.collected.set(false)
}
}
/** 收藏文章[item],使用 [snackbarData] 弹出提示 */
override suspend fun collect(item: ArticleEntity, snackbarData: MutableLiveData<SnackbarModel>) {
try {
// 收藏
repository.collectArticleInside(item.id.orEmpty())
.judge(onFailed = {
// 收藏失败,提示、回滚收藏状态
snackbarData.value = this.toSnackbarModel()
item.collected.set(false)
})
} catch (throwable: Throwable) {
Logger.t("NET").e(throwable, "collect")
// 收藏失败,提示、回滚收藏状态
snackbarData.value = throwable.toSnackbarModel()
item.collected.set(false)
}
}

/** 取消收藏文章[item] */
override fun unCollect(item: ArticleEntity) {
viewModel.run {
viewModelScope.launch {
try {
// 取消收藏
repository.unCollectArticleList(item.id.orEmpty()).judge(onFailed = {
// 取消收藏失败,提示、回滚收藏状态
snackbarData.value = toSnackbarModel()
item.collected.set(true)
})
} catch (throwable: Throwable) {
Logger.t("NET").e(throwable, "unCollect")
// 取消收藏失败,提示、回滚收藏状态
snackbarData.value = throwable.toSnackbarModel()
item.collected.set(true)
}
}
/** 取消收藏文章[item],使用 [snackbarData] 弹出提示 */
override suspend fun unCollect(item: ArticleEntity, snackbarData: MutableLiveData<SnackbarModel>) {
try {
// 取消收藏
repository.unCollectArticleList(item.id.orEmpty()).judge(onFailed = {
// 取消收藏失败,提示、回滚收藏状态
snackbarData.value = toSnackbarModel()
item.collected.set(true)
})
} catch (throwable: Throwable) {
Logger.t("NET").e(throwable, "unCollect")
// 取消收藏失败,提示、回滚收藏状态
snackbarData.value = throwable.toSnackbarModel()
item.collected.set(true)
}
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package com.wj.sampleproject.interfaces.impl

import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.viewModelScope
import cn.wj.common.ext.condition
import com.wj.sampleproject.activity.WebViewActivity
import com.wj.sampleproject.base.viewmodel.BaseViewModel
import com.wj.sampleproject.entity.ArticleEntity
import com.wj.sampleproject.interfaces.ArticleCollectionInterface
import com.wj.sampleproject.interfaces.ArticleListItemInterface
import kotlinx.coroutines.launch

/**
* 文章列表点击事件接口实现类
*
* - 创建时间:2021/1/22
*
* @author 王杰
*/
class ArticleListItemInterfaceImpl(
private val viewModel: BaseViewModel,
private val jumpToWebViewData: MutableLiveData<WebViewActivity.ActionModel>
) : ArticleListItemInterface {

/** 文章列表条目点击 */
override val onArticleItemClick: (ArticleEntity) -> Unit = { item ->
jumpToWebViewData.value = WebViewActivity.ActionModel(item.id.orEmpty(), item.title.orEmpty(), item.link.orEmpty())
}

/** 文章收藏点击 */
override val onArticleCollectClick: (ArticleEntity) -> Unit = fun(item) {
val impl = viewModel as? ArticleCollectionInterface ?: return
viewModel.viewModelScope.launch {
if (item.collected.get().condition) {
// 已收藏,取消收藏
item.collected.set(false)
impl.unCollect(item, viewModel.snackbarData)
} else {
// 未收藏,收藏
item.collected.set(true)
impl.collect(item, viewModel.snackbarData)
}
}
}
}
Loading

0 comments on commit aa949f2

Please sign in to comment.