在到达最后一张卡之前实现分页数据加载的问题 [英] Problem with implementing Pagination data load before reach at last Card

查看:30
本文介绍了在到达最后一张卡之前实现分页数据加载的问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在我的项目中实现分页,但是我没有办法从 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆