diff --git a/README.md b/README.md index 0af4577..d09f9f3 100644 --- a/README.md +++ b/README.md @@ -311,6 +311,12 @@ WanJetpack - [AndroidSwipeLayout](https://github.com/daimajia/AndroidSwipeLayout) - [SwipeRecyclerView](https://github.com/yanzhenjie/SwipeRecyclerView) - [Android 简单易上手的下拉刷新控件](https://www.jianshu.com/p/459e611c0f62) +- 加载状态的几个场景:下拉刷新、上拉加载更多、底部的已加载全部内容、首次进入页面的加载状态(及加载失败提醒) + - 下拉刷新、上拉加载更多:略 + - 首次进入页面的加载状态: + - 底部的已加载全部内容:方案比较多,个人比较倾向下面两种方案 + - 方案一:通过withLoadStateFooter实现,和上拉加载更多用同一套布局,同一个adapter。【参考本demo】 + - 方案二:通过ConcatAdapter.addAdapter实现,专门显示加载更多 - Animation 动画: 下拉刷新场景通过属性动画实现 - [官方文档](https://developer.android.google.cn/training/animation) diff --git a/app/src/main/java/com/longjunhao/wanjetpack/adapter/FooterAdapter.kt b/app/src/main/java/com/longjunhao/wanjetpack/adapter/FooterAdapter.kt index 1f041df..8f552a4 100644 --- a/app/src/main/java/com/longjunhao/wanjetpack/adapter/FooterAdapter.kt +++ b/app/src/main/java/com/longjunhao/wanjetpack/adapter/FooterAdapter.kt @@ -1,11 +1,7 @@ package com.longjunhao.wanjetpack.adapter -import android.util.Log import android.view.LayoutInflater import android.view.ViewGroup -import android.widget.Button -import android.widget.ProgressBar -import android.widget.TextView import androidx.core.view.isVisible import androidx.paging.LoadState import androidx.paging.LoadStateAdapter @@ -23,43 +19,60 @@ class FooterAdapter( private val retry: () -> Unit ) : LoadStateAdapter() { - override fun onCreateViewHolder( - parent: ViewGroup, - loadState: LoadState - ) = FooterViewHolder(parent, retry) + override fun onCreateViewHolder(parent: ViewGroup, loadState: LoadState) = + FooterViewHolder( + ListItemFooterBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ), + retry + ) - override fun onBindViewHolder( - holder: FooterViewHolder, - loadState: LoadState - ) = holder.bind(loadState) + override fun onBindViewHolder(holder: FooterViewHolder, loadState: LoadState) { + holder.bind(loadState) + } + + /** + * 1. 如果直接返回true的话,首次进入界面加载时,会执行两次网络请求,且RecyclerView会向下滚动一段距离。 + * 所以需要加上loadState.endOfPaginationReached= true的条件。 + * + * 2. 注意is的优先级比||、 &&的优先级高,所以: + * a is b && c 是 (a is b) && c 的意思 + * a is b || c 是 (a is b) || c 的意思 + * + */ + override fun displayLoadStateAsItem(loadState: LoadState): Boolean { + return loadState is LoadState.Loading + || loadState is LoadState.Error + || (loadState is LoadState.NotLoading && loadState.endOfPaginationReached) + } } class FooterViewHolder( - parent: ViewGroup, + val binding: ListItemFooterBinding, retry: () -> Unit -) : RecyclerView.ViewHolder( - LayoutInflater.from(parent.context) - .inflate(R.layout.list_item_footer, parent, false) -) { - private val binding = ListItemFooterBinding.bind(itemView) - private val progressBar: ProgressBar = binding.progressBar - private val errorMsg: TextView = binding.errorMsg - private val retry: Button = binding.retryButton - .also { - it.setOnClickListener { retry() } +) : RecyclerView.ViewHolder(binding.root) { + + init { + binding.retry.setOnClickListener { + retry() } + } - /** - * todo 遗留问题:当所有数据都加载后,应该在FooterView上显示“已经到底了”之类的。 - */ fun bind(loadState: LoadState) { - Log.d("FooterAdapter", "bind: ljh loadState=$loadState") - if (loadState is LoadState.Error) { - errorMsg.text = loadState.error.localizedMessage + binding.apply { + + if (loadState is LoadState.Error) { + msg.text = loadState.error.localizedMessage + } else if (loadState.endOfPaginationReached) { + msg.text = binding.root.resources.getString(R.string.load_end) + } + + progressBar.isVisible = loadState is LoadState.Loading + retry.isVisible = loadState is LoadState.Error + msg.isVisible = loadState is LoadState.Error || loadState.endOfPaginationReached } - progressBar.isVisible = loadState is LoadState.Loading - retry.isVisible = loadState is LoadState.Error - errorMsg.isVisible = loadState is LoadState.Error } } \ No newline at end of file diff --git a/app/src/main/res/layout/list_item_footer.xml b/app/src/main/res/layout/list_item_footer.xml index ddaf770..9d39ae7 100644 --- a/app/src/main/res/layout/list_item_footer.xml +++ b/app/src/main/res/layout/list_item_footer.xml @@ -11,10 +11,11 @@ android:orientation="vertical" android:padding="8dp"> - -