以编程方式在标题单击时滚动到 recyclerview 的最后一个位置

Posted

技术标签:

【中文标题】以编程方式在标题单击时滚动到 recyclerview 的最后一个位置【英文标题】:Programatically Scroll at the last position of recyclerview on header click 【发布时间】:2021-08-06 15:09:45 【问题描述】:

我有一个带有 netstedScroll 和一个 recyclerView 的视图,我用它来显示我的数据,所以我的片段是这样的:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    xmlns:app="http://schemas.android.com/apk/res-auto">
<androidx.core.widget.NestedScrollView
        android:id="@+id/scrollView"
        android:layout_
        android:layout_
        android:orientation="vertical"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintTop_toTopOf="parent">

<androidx.recyclerview.widget.RecyclerView
                android:id="@+id/recyclerView"
                android:layout_
                android:layout_
                tools:itemCount="10"
                tools:listitem="@layout/row_header" />
</androidx.core.widget.NestedScrollView>

recyclerview 有一个自定义适配器,我使用它来获得与可扩展视图相同的 recyclerview(我没有使用原生视图),在我上次更新之前一切都很好,所以我们决定添加更多 KPI 和信息在 recyclerview 上变成了视图的最底部:

现在的问题是,当用户点击协商时,如果不手动滚动,商品列表不会自动显示,感觉没有任何变化。 我只想点击这部分,滚动,问题是我使用的是自定义适配器:

private fun bindHeaderViewHolder(holder: RecyclerView.ViewHolder, position: Int, viewType: ViewType) 
        val dataIndex = viewType.dataIndex
        val headerViewHolder = holder as SectionHeaderViewHolder
        when(position)
           
            0 -> headerViewHolder.sectionTitle.text = "Sold out"
            1 -> headerViewHolder.sectionTitle.text = "Rent"
            2 -> headerViewHolder.sectionTitle.text = "On stock"
            3 -> headerViewHolder.sectionTitle.text = "Negociating"
        
if (isExpanded(position)) 
            headerViewHolder.expandIcon.setImageResource(R.drawable.ic_expand_less_black_24dp)
            if(position == 3)
                Log.e("position delivered", "I'm here")
            
         else 
            headerViewHolder.expandIcon.setImageResource(R.drawable.ic_expand_more_black_24dp)
        

有人可以帮助我或提出解决方案吗?

【问题讨论】:

要点 - 永远不要在任何滚动视图或嵌套滚动视图中使用 recyclerview。现在关于滚动,您可以使用recyclerView.scrollToPosition(items.size() - 1) @MohitAjwani 我不能在适配器中使用它,已经尝试过了 不,您不能在适配器内部使用它,您需要在 recyclerView 对象上执行它。它只能从您拥有实例的片段中使用 findViewById 或 kotlin 合成或任何东西来完成。您需要通过监听器给片段回调。 刚刚添加了 recyclerView.addOnItemClickListener(object: OnItemClickListener override fun onItemClicked(position: Int, view: View) recyclerView.scrollToPosition(adapter.itemCount - 1 ) ) 适配器中的 onclicklistener 没有'不再工作了,现在无法展开我的项目 您无法在 recyclerview 上添加项目。我们需要在标题点击时自定义监听器。将侦听器引用传递给适配器。在标题视图上 - 添加一个点击监听器。在其中使用传递给适配器的侦听器引用并调用回调函数。在传递侦听器的片段中,实现该函数并在其中添加 scrollToPosition 逻辑。 【参考方案1】:

您可以将侦听器连接到适配器并在需要时调用它,指示适配器内的单击位置:

class YourAdapter(val changeItemListener: (Int) -> Unit) : RecyclerView.Adapter<YourViewHolder>() 
    ...
    changeItemListener(position)
    ...

之后,您可以从 Activity 或 Fragment 创建带有监听器的适配器,并在监听器中调用 scrollToPosition 或任何您可能需要的东西。

viewModelAdapter = YourAdapter(changeItemListener = position -> your_recyclerview.smoothScrollToPosition(position))

【讨论】:

以上是关于以编程方式在标题单击时滚动到 recyclerview 的最后一个位置的主要内容,如果未能解决你的问题,请参考以下文章

我可以在 Android 中以编程方式滚动 ScrollView 吗?

iOS 以编程方式添加 UITextField 在编辑时不会将文本滚动到光标位置

以编程方式控制滚动视图——Objective-c

scrollViewDidScroll:以编程方式滚动时?

如何以编程方式滚动tableview

以编程方式将Tableview滚动到未来日期