PagingData获取网络数据,能够获取到数据,但就是不执行 Adapter这个类文件 , 这也导致布局没有加载进来
另外新建了一个项目,将代码复刻进去,能够执行Adapter类文件,并且数据显示在 recyclerView上面
这可能会是什么缘由呢? Clean Priject 过了还是一样
BookListAdapter:
class BookListAdapter( val fragment: BookListFragment): PagingDataAdapter<Book.Cate, RecyclerView.ViewHolder>(COMPARATOR) {
private val TAG_BookList = " BookListAdapter"
class ViewHolder(view: View): RecyclerView.ViewHolder(view) {
val cover: ImageView = view.findViewById(R.id.iv_cover_book)
val cateName: TextView = view.findViewById(R.id.tv_cateName_book)
val wordNum: TextView = view.findViewById(R.id.tv_wordNum_book)
}
// 绑定每一个item布局
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_book_list, parent , false)
Log.d(TAG_BookList," onBindViewHolder cateName} ")
return ViewHolder(view)
}
// 实现具体功能 & 点击事件
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
val item = getItem(position)!!
Log.d(TAG_BookList," onBindViewHolder ${item.bookList[position].cateName} ")
when(holder){
is ViewHolder ->{
holder.cateName.text = item.bookList[position].cateName
holder.wordNum.text = item.bookList[position].wordNum.toString()
Glide
.with(fragment)
.load(item.bookList[position].cover)
.into(holder.cover)
Log.d(TAG_BookList," onBindViewHolder ${item.bookList[position].cateName} ")
}
}
}
/**
* DiffUtil.ItemCallback 用于判断 是否需要加载新的Item
* DiffUtil.ItemCallback 就是用来比对数据变化,从而决定更新对应UI;并执行条目动画;
*/
companion object{
private val COMPARATOR = object : DiffUtil.ItemCallback<Book.Cate>(){
// 比对新旧条目是否是同一个条目,一般比对条目的唯一标示id即可,如果条目不同则可能不会更新UI;
override fun areItemsTheSame(oldItem: Book.Cate, newItem: Book.Cate): Boolean {
return oldItem.cateName == newItem.cateName
}
/**
* 当上面的方法确定是同一个条目之后,这里比对条目的内容是否一样,不一样则会更新条目UI
建议这里的比对把UI展示的数据都写上,写漏了会导致UI不更新对应字段;
*/
override fun areContentsTheSame(oldItem: Book.Cate, newItem: Book.Cate): Boolean {
return oldItem == newItem
}
}
}
}
BookListPagingSource:
class BookListPagingSource(private val esService: EStudyService , val i: Int): PagingSource<String, Book.Cate>() {
private val TAG =" BookListPagingSource "
// load(包含有关要执行的加载操作的信息,其中包括要加载的键和要加载的项数)
override suspend fun load(params: LoadParams<String>): LoadResult<String, Book.Cate> {
return try {
val url = params.key ?: EStudyService.BOOK_URL // API
Log.d(TAG, "load: url: $url")
val cateResponse = esService.getBook(url)
var cateItems = cateResponse.cates.size
val cateItem = cateResponse.cates
val preKey = null
var nextKey: Book.Cate? = null
enter_Num++ // 全局变量
// 第一次进入该方法
if ( enter_Num == 1){
index_book = cateItems-1
}
nextKey = cateResponse.cates[index_book--]
/**
* LoadResult作为 load() 的返回值
* LoadResult.Page(从响应数据解析出来的对象类型,上一页的页数,下一页的页数),并返回结果
*/
Log.d(TAG, " load - ,${index_book} , $cateItems $nextKey")
LoadResult.Page(cateItem, preKey, nextKey.toString())
} catch (e: Exception) {
Log.d(TAG, " load - ,抛出异常 $e ")
LoadResult.Error(e)
}
}
override fun getRefreshKey(state: PagingState<String, Book.Cate>): String? = null
}
BookListFragment:
class BookListFragment: BaseFragment() {
private var _binding: LayoutBookListBinding? = null
private val binding get() = _binding!!
private val viewModel by lazy {
ViewModelProvider(this, InjectorUtil.getBookViewModelFactory()).get(BookListViewModel::class.java)
}
private lateinit var adapter: BookListAdapter
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
_binding = LayoutBookListBinding.inflate(layoutInflater,container,false)
return super.onCreateView(binding.root)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
adapter = BookListAdapter(this)
val layoutManager = LinearLayoutManager(activity)
Log.d(TAG,"onViewCreate -- $layoutManager ,$adapter , $activity $context")
binding.recyclerViewBook.layoutManager = layoutManager
lifecycleScope.launch {
/*
pay attention to the selection of the collect
submitData() receive a PagingData parameter, which can be obtained from the collect()
注意:submitData之后不会返回,所以在它的后面写代码不会被执行
*/
viewModel.getBookPagingData().collect {
adapter.submitData(it)
Log.d(TAG, " 这段代码不会被执行 ")
}
Log.d(TAG, " 这段代码不会被执行 ")
}
}
override fun onDestroy() {
super.onDestroy()
_binding = null
}
}
layout_book_list.xml:
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:cardBackgroundColor="@color/purple_200"
app:cardCornerRadius="4dp"
app:cardElevation="4dp"
app:cardPreventCornerOverlap="true"
app:cardUseCompatPadding="true" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/app_name"/>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView_book"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</androidx.cardview.widget.CardView>
item_book_list.xml
<?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="match_parent">
<ImageView
android:id="@+id/iv_cover_book"
android:layout_width="140dp"
android:layout_height="141dp"
android:padding="@dimen/space_16dp"
android:src="@color/black"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tv_cateName_book"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingTop="@dimen/space_32dp"
android:text="@string/cateName"
android:textSize="@dimen/text_size_16dp"
android:textStyle="bold"
app:layout_constraintStart_toEndOf="@+id/iv_cover_book"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tv_wordNum_book"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingTop="@dimen/space_32dp"
android:text="@string/wordNum"
app:layout_constraintStart_toEndOf="@+id/iv_cover_book"
app:layout_constraintTop_toBottomOf="@+id/tv_cateName_book" />
</androidx.constraintlayout.widget.ConstraintLayout>
这里加上
binding.recyclerViewBook.adapter = adapter
你的 RecyclerView 只设置了 LayoutManager 但是并没有设置 Adapter 呀 既然 Adapter 都没有设置 那又怎么会有效果呢
1.检查下有没有初始化Adapter这个类
2.Recyclerview有没有设置Adapter