Как сохранить положение прокрутки во вложенном представлении Vertcial Recycler и после обновления представлений достичь состояния до обновления? - PullRequest
0 голосов
/ 21 мая 2019

У меня горизонтальный вид переработчика, а внутри каждого держателя есть вложенный вертикальный вид переработчика.Пользователь может прокручивать вложенный вид переработчика.Мне нужно обновлять горизонтальное представление рециркулятора или некоторые его виды каждые 5-10 секунд и сохранять точное положение прокрутки вложенных рециклеров.

Основная проблема заключается в том, что в функции onViewRecycled (holder ...) держатель.adapterPosition всегда равно -1.Не важно что.

Сохранить состояние прокрутки во вложенном RecyclerView

Я уже пробовал это решение, но оно не работает, потому что я продолжаю получать holder.adapterPositon == -1 внутри onViewRecycled (держатель ...)

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
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...