在到达最后一张卡之前实现分页数据加载的问题 [英] Problem with implementing Pagination data load before reach at last Card
本文介绍了在到达最后一张卡之前实现分页数据加载的问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试在我的项目中实现分页,但是我没有办法从 Firestore 中加载所有数据.
I am trying to implement Pagination in My project but i don't how it loads all the data from Firestore.
我尝试使用自己的方法进行分页,但是我对分页没有错.
I tried my Own method to Paginate but i don't where i am wrong with pagination.
代码:
分配的变量
lateinit var adapter: BooksListAdapter
var booksArray = arrayListOf<Book>()
var totalItemCount: Int = 0
var lastVisibleItem : Int = 0
var visibleThreshold : Int = 0
var item_count = 6
private var loading : Boolean = false
布局管理器和适配器声明
Layout Manager and Adapter Declaration
val mLayoutManager = LinearLayoutManager(this)
books_list.setLayoutManager(mLayoutManager)
adapter = BooksListAdapter(arrayListOf(), singlePage, multiplePage, this)
books_list.adapter = adapter
第一视图中的数据加载
private fun getBooksData() {
bookCollection
.orderBy("created_at", Query.Direction.DESCENDING)
.limit(item_count.toLong()).get()
.addOnSuccessListener { booksSnapshot ->
if (!booksSnapshot.isEmpty) {
for (bookSnapShot in booksSnapshot.documents) {
val hashmap = bookSnapShot.data
hashmap?.put("id", bookSnapShot.id)
val bookData = Gson().toJson(hashmap)
val book = Gson().fromJson<Book>(bookData, Book::class.java)
booksArray.add(book)
}
shimmer_view_container_book.stopShimmerAnimation()
shimmer_view_container_book.setVisibility(View.GONE)
rcv_book.setVisibility(View.VISIBLE)
adapter.booksList.addAll(booksArray)
adapter.notifyDataSetChanged()
}
}
.addOnFailureListener { exception ->
Toast.makeText(this, exception.message, Toast.LENGTH_SHORT).show()
}
}
和我的onaddScrollListener:
and my onaddScrollListener :
books_list.addOnScrollListener(object : RecyclerView.OnScrollListener() {
override fun onScrolled(recyclerView: RecyclerView,
dx: Int, dy: Int) {
super.onScrolled(recyclerView, dx, dy)
visibleThreshold = books_list.getChildCount();
totalItemCount = mLayoutManager.getItemCount()
lastVisibleItem = mLayoutManager
.findLastVisibleItemPosition()
if (!loading && totalItemCount <= lastVisibleItem + visibleThreshold) {
getMoreBooks(adapter.getLastBook())
loading = true
}
}
})
获取更多图书:
private fun getMoreBooks(lastBook: Timestamp) {
bookCollection
.orderBy("created_at", Query.Direction.DESCENDING)
.startAfter(lastBook)
.limit(item_count.toLong()).get()
.addOnSuccessListener {booksSnapshot ->
if (!booksSnapshot.isEmpty) {
for (bookSnapShot in booksSnapshot.documents) {
val hashmap = bookSnapShot.data
hashmap?.put("id", bookSnapShot.id)
val bookData = Gson().toJson(hashmap)
val book = Gson().fromJson<Book>(bookData, Book::class.java)
adapter.addDatainList(book)
}
}
}
}
适配器:
class BooksListAdapter (var booksList: ArrayList<Book>, val singlePage: View.OnClickListener, val multiplePage: View.OnClickListener, val context : Context): RecyclerView.Adapter<BooksListAdapter.ViewHolder>() {
var bookid = ""
val storageReference = FirebaseStorage.getInstance()
fun getLastBook(): Timestamp{
return booksList.get(booksList.size-1).created_at
}
fun addDatainList(book : Book){
booksList.add(book)
notifyDataSetChanged()
}
override fun onCreateViewHolder(parent: ViewGroup, position: Int): ViewHolder {
val itemView = LayoutInflater.from(parent.context).inflate(R.layout.single_book, parent, false)
return ViewHolder(itemView)
}
override fun getItemCount(): Int {
return booksList.size
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
if (booksList.get(position).picture != "null"){
GlideApp.with(context).load(booksList[position].picture?.let { storageReference.reference.child(it) }).centerCrop().override(300, 300).into(holder.bookImage!!)
}else{
GlideApp.with(context).load(R.drawable.picture).centerCrop().override(300, 300).into(holder.bookImage!!)
}
holder.bookCard!!.setOnClickListener {
if (booksList[position].pages > 1){
bookid = booksList.get(position).id
multiplePage.onClick(it)
}else{
bookid = booksList.get(position).id
singlePage.onClick(it)
}
}
holder.bookTitle!!.setText(booksList[position].book_name)
holder.bookPages!!.setText("Book Pages : ${booksList[position].pages}")
holder.bookAuther!!.setText(booksList[position].auther)
holder.bookDescription!!.setText(booksList[position].book_description)
}
class ViewHolder (itemView: View) : RecyclerView.ViewHolder(itemView) {
var bookCard: CardView? = null
var bookTitle: TextView? = null
var bookDescription: TextView? = null
var bookPages: TextView? = null
var bookAuther: TextView? = null
var bookImage : ImageView? = null
init {
this.bookCard = itemView.findViewById(R.id.single_book_card)
this.bookTitle = itemView.findViewById(R.id.book_title_txt)
this.bookDescription = itemView.findViewById(R.id.book_desc_txt)
this.bookAuther = itemView.findViewById(R.id.auther_txt)
this.bookPages = itemView.findViewById(R.id.book_pages)
this.bookImage = itemView.findViewById(R.id.book_img)
}
}
}
先谢谢您
如果您想生病,请提供其他信息
If you want ill provide other info
推荐答案
我的示例希望对您有帮助
page = 0
var previous = 0
val viewth = 20
recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
super.onScrolled(recyclerView, dx, dy)
visible = gridLayoutManager.childCount
total = gridLayoutManager.itemCount
past = gridLayoutManager.findFirstVisibleItemPosition()
if (dy > 0) {
if (loading) {
if (total > previous) {
loading = false
previous = total
}
}
if (!loading && (total - visible) <= (past + viewth)) {
page++
getNextData(page.toString(), range)//call your next set
loading = true
}
} else {
mSwipeRefreshLayout.isEnabled = gridLayoutManager.findFirstCompletelyVisibleItemPosition() == 0
}
}
override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
super.onScrollStateChanged(recyclerView, newState)
mSwipeRefreshLayout.isEnabled = gridLayoutManager.findFirstCompletelyVisibleItemPosition() == 0
}
})
这篇关于在到达最后一张卡之前实现分页数据加载的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文