如何保存嵌套的Vertcial Recycler View的滚动位置,并在刷新视图后达到刷新之前的状态?

时间:2019-05-21 06:31:52

标签: android kotlin android-recyclerview

我有一个水平的回收站视图,每个支架内有一个嵌套的垂直的回收站视图。 用户可以滚动浏览嵌套的回收站视图。 我需要每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
    }
}

0 个答案:

没有答案