以编程方式在标题单击时滚动到 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 吗?