无限滚动的 Kotlin 回收视图/列表视图

10

我正在努力使用Kotlin在Android应用程序上实现无限滚动。所有的教程都没能很好地解释事情,因此都是无用的。例如:https://github.com/chetdeva/recyclerview-bindings

这个看起来很有前途,但是作者使用了像“将此放入您的BindingAdapter中”这样的短语,所以我查看了一下BindingAdapter是什么,我找到了一个Java文件,但是如果你在里面插入任何东西,我会得到错误。就好像我尝试的任何事情直接失败了。

其他的教程是用Java编写的,即使有“转换为Kotlin”的选项,也是无用的,因为翻译后的代码会报100个错误。

我尝试过以下方法:

setContentView(R.layout.activity_main)
    list.layoutManager = LinearLayoutManager(this)
    list.hasFixedSize()
    list.adapter = ListAdapter(this, getLists())
    val list_view: RecyclerView = findViewById(R.id.list)
    fun setRecyclerViewScrollListener() {
        list_view.addOnScrollListener(object : RecyclerView.OnScrollListener() {
            override fun onScrolled(recyclerView: RecyclerView?, dx: Int, dy: Int) {
                val height = list_view.getHeight()

                val diff = height-dy
                if (diff < 1000){
                    /*load next list */
                }
            }
        })
    }
    setRecyclerViewScrollListener()
}

或者这个

val inflater = LayoutInflater.from(this@MainActivity)
val layout = inflater.inflate(R.layout.append_list, null, false)
button.setOnClickListener{screen.addView(layout)}

有没有一种像html和js那样简单的方法,可以简单地追加元素?我在2分钟内编写了这个片段。在Android / Kotlin中有类似的“简单”方式吗?

$("#next").click(function(){
  $(".append_text").append("new text <img src='http://static.webshopapp.com/shops/015426/files/005031634/560x625x2/kek-amsterdam-wandtattoo-hase-forest-friends-braun.jpg'/>")
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button id="next">Load</button>

<span class="append_text"> </span>

通常我因选择错误的布局而收到很多错误。我尝试了Listview和contrainlayout和recycling Layout和Vertical Scrolling layout等等。是否有一个简单的body标签,可以简单地附加一个xml文件?

我认为我一直走错了路,因为我看到的一切都是通过Web开发者的眼睛来看待的,而Android没有传统的DOM。是否有人能用一个最小的例子向我解释如何在单击按钮/滚动时将XML文件附加到主XML文件中?

3个回答

16

我使用这种方法在 Kotlin 中为 RecyclerView 添加无限滚动的功能:

private fun setRecyclerViewScrollListener() {
    scrollListener = object : RecyclerView.OnScrollListener() {
        override fun onScrollStateChanged(recyclerView: RecyclerView?, newState: Int) {
            super.onScrollStateChanged(recyclerView, newState)
            val totalItemCount = recyclerView!!.layoutManager.itemCount
            if (totalItemCount == lastVisibleItemPosition + 1) {
                Log.d("MyTAG", "Load new list")
                recycler.removeOnScrollListener(scrollListener)
            }
        }
    }
    recycler.addOnScrollListener(scrollListener)
}

变量lastVisibleItemPosition声明如下:

private val lastVisibleItemPosition:Int get() = linearLayoutManager.findLastVisibleItemPosition()

private lateinit var scrollListener: RecyclerView.OnScrollListener

每当您需要将此功能添加到recyclerView时,请简单地调用setRecyclerViewScrollListener()方法即可。

希望能对您有所帮助,

Leonardo


你在哪里定义这些方法?如果我将它们添加到我的MainActivity的onCreate函数中,getlinearLayoutManagerLOG_TAGchatRecyclerrecyclerscrollListener要么未定义,要么无法解析。XML文件在哪里? - hansTheFranz
@hansTheFranz 我编辑了我的代码,抱歉打错了字,chatRecycler和recyler是同一个RecyclerView,LOG_TAG是用于记录日志的字符串,我还添加了scrollListener的声明。linearLayoutManager是您必须设置为recyclerview的布局管理器,而get()是lastVisibleItemPosition变量的getter。 - Leonardo Medori
感谢您提供这段代码,@LeonardoMedori。 我可以问一下您为什么在代码中加入了这一行吗? recycler.removeOnScrollListener(scrollListener) - Rod
@Rod 我移除了scrollListener,然后在更新列表完成后再次添加它。如果我不移除监听器,则onScrollStateChanged方法会被调用多次,并且(totalItemCount == lastVisibleItemPosition + 1)条件可能会多次成立。因此,我没有使用布尔值来检查列表是否已更新,而是移除了监听器,进行一次调用,更新列表,然后再次添加监听器。 - Leonardo Medori

2

嗯,我不确定这是否能解决您的问题,但我使用以下方法来实现在滚动到底部时向我的回收站添加新数据:

productsListActivityBinding.recyclerViewProducts.addOnScrollListener(object : RecyclerView.OnScrollListener() {
        override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
            super.onScrollStateChanged(recyclerView, newState)
            if (!recyclerView.canScrollVertically(1)){
                //function that add new elements to my recycler view
            }
        }

    })

0

在滚动监听器中设置回收视图

 recycler.addOnScrollListener(your listener)

2
请参见“完全基于代码的答案解释”。虽然这可能在技术上是正确的,但它并没有解释为什么它可以解决问题或应该被选为答案。我们应该在帮助解决问题的同时进行教育。 - the Tin Man

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接