【问题标题】:Endless scroll kotlin recycling view/ListView无休止的滚动kotlin回收视图/ListView
【发布时间】:2018-07-01 06:35:13
【问题描述】:

我正在拼命尝试使用 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 分钟内写了这个 sn-p。 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 以及回收 Layout 和 Vertical Scrolling 布局等。是否有一个简单的正文标签,您可以在其中简单地附加一个 xml 文件?

我认为我一直走错路,因为我通过网络的眼睛看到了一切。开发。而android没有经典的DOM。任何人都可以用一个关于如何在按钮单击/滚动时将 xml 文件附加到主 xml 文件的最小示例向我解释一下吗?

【问题讨论】:

    标签: android android-recyclerview kotlin infinite-scroll


    【解决方案1】:

    我使用这种方法在 Kotlin 的回收视图中添加无限滚动功能:

    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() 方法即可。

    希望对你有帮助,

    莱昂纳多

    【讨论】:

    • 你在哪里定义这些方法?如果我将它添加到我的 MainAct 中。在 onCreate 函数中,getlinearLayoutManagerLOG_TAGchatRecyclerrecyclerscrollListener 要么未定义,要么无法解析。 xml 文件在哪里?
    • @hansTheFranz 我编辑了我的代码,很抱歉打印错误,chatRecycler 和recyler 是同一个RecyclerView,LOG_TAG 是一个用于记录目的的字符串,我还添加了scrollListener 的声明。 linearLayoutManager 是您必须设置为 recyclerview 的布局管理器,而 get() 是 lastVisibleItemPosition 变量的 getter。
    • 感谢这段代码,@LeonardoMedori。我能问你为什么你的代码中有下一行吗? recycler.removeOnScrollListener(scrollListener)
    • @Rod 我删除了 scrollListener 并在完成更新列表后再次添加它。如果我不删除侦听器,则会多次调用 onScrollStateChanged 方法,并且 (totalItemCount == lastVisibleItemPosition + 1) 条件可以多次为真。因此,我没有使用布尔值来检查列表是否已更新,而是删除了侦听器,拨打电话,更新列表,然后再次添加侦听器。
    【解决方案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
                }
            }
    
        })
    

    【讨论】:

      【解决方案3】:

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

       recycler.addOnScrollListener(your listener)
      

      【讨论】:

      • 见“Explaining entirely code-based answers”。虽然这在技术上可能是正确的,但它并不能解释为什么它可以解决问题或应该是选择的答案。除了帮助解决问题,我们还应该进行教育。
      猜你喜欢
      • 1970-01-01
      • 2020-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多