Skip to content

Commit 696592e

Browse files
committed
新增下拉刷新
1 parent adf1a59 commit 696592e

File tree

14 files changed

+252
-89
lines changed

14 files changed

+252
-89
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
1.Paging3和Room结合;
1515

16-
2.将Glide替换为coil
16+
2.将Glide替换为Coil
1717

1818
**2021.5.17更新**
1919

common/src/main/java/com/fuusy/common/base/BaseActivity.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import com.fuusy.common.widget.LoadingDialog
1212
abstract class BaseActivity<T : ViewDataBinding> : AppCompatActivity {
1313

1414
constructor() : super()
15+
1516
private lateinit var mLoadingDialog: LoadingDialog
1617

1718
var mBinding: T? = null
@@ -51,7 +52,6 @@ abstract class BaseActivity<T : ViewDataBinding> : AppCompatActivity {
5152
}
5253

5354

54-
5555
/**
5656
* 设置toolbar名称
5757
*/

common/src/main/java/com/fuusy/common/base/BaseFragment.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ abstract class BaseFragment<T : ViewDataBinding> : Fragment() {
5454

5555
override fun onDestroy() {
5656
super.onDestroy()
57+
mBinding?.unbind()
5758
}
5859

5960
abstract fun getLayoutId(): Int

common/src/main/java/com/fuusy/common/base/paging/BasePagingAdapter.kt

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,7 @@ abstract class BasePagingAdapter<T : Any>(private var diffCallback: DiffUtil.Ite
6767
private val helper: ItemHelper = ItemHelper(this)
6868

6969
fun bindNormalData(item: Any?) {
70-
7170
bindData(helper, item as T)
72-
7371
}
7472
}
7573

@@ -102,11 +100,11 @@ abstract class BasePagingAdapter<T : Any>(private var diffCallback: DiffUtil.Ite
102100
}
103101

104102
/**
105-
* Glide加载图片
103+
* Coil加载图片
106104
*/
107105
fun bindImgGlide(viewId: Int, url: String) {
108106
val imageView: ImageView = findViewById(viewId) as ImageView
109-
imageView.load(url){
107+
imageView.load(url) {
110108
placeholder(R.mipmap.img_placeholder)
111109
}
112110

Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
package com.fuusy.home.adapter.paging
2+
3+
import android.view.LayoutInflater
4+
import android.view.ViewGroup
5+
import android.widget.TextView
6+
import androidx.paging.PagingDataAdapter
7+
import androidx.recyclerview.widget.DiffUtil
8+
import androidx.recyclerview.widget.RecyclerView
9+
import coil.load
10+
import com.alibaba.android.arouter.launcher.ARouter
11+
import com.fuusy.common.support.Constants
12+
import com.fuusy.home.R
13+
import com.fuusy.home.bean.ArticleData
14+
import com.fuusy.home.bean.BannerData
15+
import com.fuusy.home.databinding.ItemBannerBinding
16+
import com.fuusy.home.databinding.ItemRvArticleBinding
17+
import com.youth.banner.adapter.BannerImageAdapter
18+
import com.youth.banner.holder.BannerImageHolder
19+
20+
/**
21+
* @date:2021/5/21
22+
* @author fuusy
23+
* @instruction: 首页多typeAdapter,包含Banner和文章列表
24+
*/
25+
class ArticleMultiPagingAdapter :
26+
PagingDataAdapter<ArticleData, RecyclerView.ViewHolder>(differCallback) {
27+
28+
//banner数据源
29+
private var bannerList: List<BannerData> = ArrayList()
30+
31+
fun addBannerList(list: List<BannerData>) {
32+
bannerList = list
33+
}
34+
35+
companion object {
36+
const val TYPE_BANNER = 0
37+
const val TYPE_ARTICLE = 1
38+
39+
val differCallback = object : DiffUtil.ItemCallback<ArticleData>() {
40+
override fun areItemsTheSame(oldItem: ArticleData, newItem: ArticleData): Boolean {
41+
return oldItem.id == newItem.id
42+
}
43+
44+
override fun areContentsTheSame(oldItem: ArticleData, newItem: ArticleData): Boolean {
45+
return oldItem == newItem
46+
}
47+
}
48+
}
49+
50+
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
51+
if (getItemViewType(position) == TYPE_BANNER) {
52+
(holder as BannerVH).bindData(bannerList)
53+
} else {
54+
getItem(position - 1)?.let {
55+
(holder as ArticleVH).bindData(it)
56+
}
57+
}
58+
}
59+
60+
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
61+
if (viewType == TYPE_BANNER) {
62+
return BannerVH(
63+
ItemBannerBinding.inflate(
64+
LayoutInflater.from(parent.context),
65+
parent,
66+
false
67+
)
68+
)
69+
}
70+
71+
72+
val articleVH =
73+
ArticleVH(
74+
ItemRvArticleBinding.inflate(
75+
LayoutInflater.from(parent.context),
76+
parent,
77+
false
78+
)
79+
)
80+
articleVH.itemView.setOnClickListener {
81+
val data = getItem(articleVH.layoutPosition - 1)
82+
//跳转到webView 文章详情
83+
ARouter.getInstance()
84+
.build(Constants.PATH_WEBVIEW)
85+
.withString(Constants.KEY_WEBVIEW_PATH, data?.link)
86+
.withString(Constants.KEY_WEBVIEW_TITLE, data?.title)
87+
.navigation()
88+
}
89+
return articleVH
90+
}
91+
92+
override fun getItemViewType(position: Int): Int {
93+
if (position == 0) {
94+
return TYPE_BANNER
95+
}
96+
return TYPE_ARTICLE
97+
}
98+
99+
internal class BannerVH(val binding: ItemBannerBinding) :
100+
RecyclerView.ViewHolder(binding.root) {
101+
//绑定banner数据
102+
fun bindData(data: List<BannerData>) {
103+
binding.bannerArticle.adapter = object : BannerImageAdapter<BannerData>(data) {
104+
override fun onBindView(
105+
holder: BannerImageHolder?,
106+
data: BannerData?,
107+
position: Int,
108+
size: Int
109+
) {
110+
holder!!.imageView.load(data?.imagePath) {
111+
placeholder(R.mipmap.img_placeholder)
112+
}
113+
114+
}
115+
}
116+
}
117+
}
118+
119+
internal class ArticleVH(val binding: ItemRvArticleBinding) :
120+
RecyclerView.ViewHolder(binding.root) {
121+
//绑定文章列表
122+
fun bindData(data: ArticleData) {
123+
setText(binding.tvArticleTitle, data.title)
124+
setText(binding.btHealthInfoType, data.superChapterName)
125+
setText(binding.tvHomeInfoTime, data.niceDate)
126+
127+
if (data.author.isEmpty()) {
128+
setText(binding.tvArticleAuthor, data.shareUser)
129+
} else {
130+
setText(binding.tvArticleAuthor, data.author)
131+
}
132+
}
133+
134+
private fun setText(view: TextView, text: String) {
135+
view.text = text
136+
}
137+
}
138+
}

home/src/main/java/com/fuusy/home/adapter/viewpager/HomePageAdapter.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,11 @@ import com.fuusy.home.ui.SquareFragment
1010

1111
private const val TAG = "HomePageAdapter"
1212

13+
/**
14+
* @date:2021/5/21
15+
* @author fuusy
16+
* @instruction: 首页ViewPagerAdapter,主要加载DailyQuestionFragment、ArticleFragment、SquareFragment
17+
*/
1318
@ExperimentalPagingApi
1419
class HomePageAdapter(fragment: Fragment) : FragmentStateAdapter(fragment) {
1520
override fun getItemCount(): Int {

home/src/main/java/com/fuusy/home/ui/ArticleFragment.kt

Lines changed: 14 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,20 @@
11
package com.fuusy.home.ui
22

3+
import android.util.Log
34
import android.view.View
45
import androidx.lifecycle.lifecycleScope
56
import androidx.paging.ExperimentalPagingApi
67
import androidx.paging.LoadState
78
import androidx.recyclerview.widget.RecyclerView
8-
import coil.load
99

1010
import com.fuusy.common.base.BaseFragment
1111
import com.fuusy.common.network.net.IStateObserver
1212
import com.fuusy.common.widget.FooterAdapter
1313
import com.fuusy.home.R
14-
import com.fuusy.home.adapter.paging.HomeArticlePagingAdapter
14+
import com.fuusy.home.adapter.paging.ArticleMultiPagingAdapter
1515
import com.fuusy.home.bean.BannerData
1616
import com.fuusy.home.databinding.FragmentArticleBinding
1717
import com.fuusy.home.viewmodel.ArticleViewModel
18-
import com.youth.banner.adapter.BannerImageAdapter
19-
import com.youth.banner.holder.BannerImageHolder
2018
import kotlinx.coroutines.flow.collectLatest
2119
import kotlinx.coroutines.launch
2220
import org.koin.androidx.viewmodel.ext.android.viewModel
@@ -34,7 +32,7 @@ class ArticleFragment : BaseFragment<FragmentArticleBinding>() {
3432
private val mViewModel: ArticleViewModel by viewModel()
3533

3634
private var mArticlePagingAdapter =
37-
HomeArticlePagingAdapter()
35+
ArticleMultiPagingAdapter()
3836

3937
override fun initData() {
4038
initListener()
@@ -50,18 +48,9 @@ class ArticleFragment : BaseFragment<FragmentArticleBinding>() {
5048
override fun onDataChange(data: List<BannerData>?) {
5149
super.onDataChange(data)
5250
//绑定banner
53-
mBinding?.bannerArticle?.adapter = object : BannerImageAdapter<BannerData>(data) {
54-
override fun onBindView(
55-
holder: BannerImageHolder?,
56-
data: BannerData?,
57-
position: Int,
58-
size: Int
59-
) {
60-
holder!!.imageView.load(data?.imagePath){
61-
placeholder(R.mipmap.img_placeholder)
62-
}
63-
64-
}
51+
data?.let {
52+
mArticlePagingAdapter.addBannerList(it)
53+
mArticlePagingAdapter.notifyItemChanged(0)
6554
}
6655
}
6756

@@ -70,7 +59,7 @@ class ArticleFragment : BaseFragment<FragmentArticleBinding>() {
7059
})
7160

7261
//请求首页文章列表
73-
lifecycleScope.launch {
62+
lifecycleScope.launchWhenCreated {
7463
mViewModel.articlePagingFlow().collectLatest { data ->
7564
mArticlePagingAdapter.submitData(data)
7665
}
@@ -80,24 +69,17 @@ class ArticleFragment : BaseFragment<FragmentArticleBinding>() {
8069

8170
private fun initListener() {
8271

83-
mBinding?.rvHomeArticle?.addOnScrollListener(object : RecyclerView.OnScrollListener() {
84-
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
85-
super.onScrolled(recyclerView, dx, dy)
86-
87-
}
88-
})
89-
//下拉刷洗
90-
// mBinding?.swipeLayout?.setOnRefreshListener {
91-
// Log.d(TAG, "initListener: refresh")
92-
// mArticlePagingAdapter.refresh()
93-
// }
72+
//下拉刷新
73+
mBinding?.swipeLayout?.setOnRefreshListener {
74+
mViewModel.loadBanner()
75+
mArticlePagingAdapter.refresh()
76+
}
9477

9578
//监听paging数据刷新状态
9679
lifecycleScope.launchWhenCreated {
9780
mArticlePagingAdapter.loadStateFlow.collectLatest {
98-
if (it.refresh !is LoadState.Loading) {
99-
//mBinding?.swipeLayout?.isRefreshing = false
100-
}
81+
Log.d(TAG, "initListener: $it")
82+
mBinding?.swipeLayout?.isRefreshing = it.refresh is LoadState.Loading
10183
}
10284
}
10385
}

home/src/main/java/com/fuusy/home/ui/DailyQuestionFragment.kt

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package com.fuusy.home.ui
22

33
import androidx.lifecycle.lifecycleScope
44
import androidx.paging.ExperimentalPagingApi
5+
import androidx.paging.LoadState
56
import com.fuusy.common.base.BaseFragment
67
import com.fuusy.common.widget.FooterAdapter
78
import com.fuusy.home.R
@@ -25,27 +26,35 @@ class DailyQuestionFragment : BaseFragment<FragmentDailyQuestionBinding>() {
2526

2627
override fun initData() {
2728
initRecyclerview()
29+
initListener()
30+
loadData()
31+
}
2832

29-
lifecycleScope.launch {
33+
private fun loadData() {
34+
lifecycleScope.launchWhenCreated {
3035
mViewModel.dailyQuestionPagingFlow().collectLatest {
3136
dailyPagingAdapter.submitData(it)
3237
}
3338
}
3439
}
3540

41+
private fun initListener() {
42+
mBinding?.swipeLayout?.setOnRefreshListener {
43+
dailyPagingAdapter.refresh()
44+
}
45+
lifecycleScope.launchWhenCreated {
46+
dailyPagingAdapter.loadStateFlow.collectLatest {
47+
mBinding?.swipeLayout?.isRefreshing = it.refresh is LoadState.Loading
48+
}
49+
}
50+
}
51+
3652
private fun initRecyclerview() {
3753
mBinding?.rvDailyQuestion?.adapter = dailyPagingAdapter.withLoadStateFooter(
3854
FooterAdapter {
3955
dailyPagingAdapter.retry()
4056
})
4157

42-
dailyPagingAdapter.addLoadStateListener {
43-
44-
when (it.refresh) {
45-
46-
}
47-
}
48-
4958
}
5059

5160
override fun getLayoutId(): Int {

0 commit comments

Comments
 (0)