我有一个水平的回收站视图,每个支架内有一个嵌套的垂直的回收站视图。 用户可以滚动浏览嵌套的回收站视图。 我需要每5-10秒刷新一次水平回收站视图或其某些视图,并保存嵌套回收站的确切滚动位置。
主要问题是在onViewRecycled(holder ...)函数中,holder.adapterPosition始终等于-1。无论。
Save scroll state in nested RecyclerView
我已经尝试过此解决方案,但是它不可能工作,因为我一直在onViewRecycled(holder ...)内获取holder.adapterPositon == -1
class ExampleStackOverflowAdapter(private var list: MutableList<ReceiptObject>) : RecyclerView.Adapter<KitchenReceiptUpperViewHolder>() {
private lateinit var mContext: Context
private lateinit var mViewPool: RecyclerView.RecycledViewPool
var listener: KitchenReceiptUpperAdapterListener? = null
private val mPositionsMap = mutableMapOf<Int, Int>()
override fun onCreateViewHolder(parent: ViewGroup, position: Int): KitchenReceiptUpperViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.holder_kitchen_item_upper, parent, false)
mContext = parent.context
mViewPool = RecyclerView.RecycledViewPool()
return KitchenReceiptUpperViewHolder(view)
}
override fun onBindViewHolder(holder: KitchenReceiptUpperViewHolder, position: Int) {
val item = list[position]
(Setting some views...)
val insideLayoutManager = ErrorHandlingLinearLayoutManager(mContext, LinearLayoutManager.VERTICAL, false)
insideLayoutManager.initialPrefetchItemCount = 5
holder.kitchenReceiptList.apply {
layoutManager = insideLayoutManager
setRecycledViewPool(mViewPool)
val insideAdapter = KitchenReceiptsUpperInnerAdapter(item.items, mContext)
insideAdapter.onItemClicked = { innerPosition, innerItem ->
listener?.onInnerItemClicked(holder.adapterPosition, innerPosition, innerItem)
}
adapter = insideAdapter
clearOnScrollListeners()
}
holder.kitchenReceiptList.post {
holder.kitchenReceiptList.addOnScrollListener(object : RecyclerView.OnScrollListener() {
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
super.onScrolled(recyclerView, dx, dy)
(Some code ...)
}
})
holder.kitchenReceiptList.scrollY = mPositionsMap[holder.adapterPosition] ?: 0
}
}
override fun onViewRecycled(holder: KitchenReceiptUpperViewHolder) {
mPositionsMap[holder.adapterPosition] = holder.kitchenReceiptList.scrollY
super.onViewRecycled(holder)
}
override fun getItemCount(): Int {
return list.size
}
}