Я использую утилита просмотра с горизонтальным LinearLayoutManager.Я хочу изменить цвет элемента переработчика, когда элемент привязан к середине.
Поэтому я использовал LinearSnapHelper.
В настоящий момент каждый элемент, который был предварительно привязан, остается с привязанным фоновым цветом.Итак, что я сделал, я сделал глобальную переменную snappedPosition и установил ее в 0, поэтому первый элемент в обзоре реселлера будет привязан по умолчанию.
Затем я вызвал эту snappedPosition в onBindViewHolder моего адаптера и изменил цвет элемента напо умолчанию для каждого элемента в окне повторного использования, кроме одного с той же позицией, что и позиция привязанного элемента.Но в notifyItemChanged (position) я получил:
java.lang.IllegalStateException: невозможно вызвать этот метод, пока RecyclerView вычисляет макет или прокручивает android.support.v7.widget.RecyclerView
код внутри фрагмента:
val snapHelper: LinearSnapHelper = LinearSnapHelper()
var snappedPosition: Int = 0
addressRecyclerView = view.findViewById<RecyclerView>(R.id.address_recycler_view).apply {
setHasFixedSize(true)
layoutManager = viewManager
adapter = viewAdapter
}
snapHelper.attachToRecyclerView(addressRecyclerView)
addressRecyclerView.onFlingListener = snapHelper
itemOffsetDecoration = ItemOffsetDecoration(context, R.dimen.address_recyclerview_padding)
addressRecyclerView.addItemDecoration(itemOffsetDecoration)
addressRecyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {
override fun onScrollStateChanged(recyclerView: RecyclerView?, newState: Int) {
if (newState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE) {
val centerView = snapHelper.findSnapView(viewManager)
if (centerView != null) {
snappedPosition = addressRecyclerView.getChildAdapterPosition(centerView)
}
}
}
})
код внутри onBindViewHolder
addressList[position].let {
if (position == fragment.snappedPosition){
holder.itemViewLayout.setBackgroundResource(R.drawable.payment_button_active)
notifyItemChanged(position)
} else {
holder.itemViewLayout.setBackgroundResource(R.drawable.payment_button_inactive)
notifyItemChanged(position)
}
}
То, чего я хочу достичь, похоже на этот пример изображения:
Обновление: пример кода для варианта изменения цвета (все еще не работает):
addressRecyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {
override fun onScrollStateChanged(recyclerView: RecyclerView?, newState: Int) {
if (newState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE) {
val centerView = snapHelper.findSnapView(addressRecyclerView.layoutManager)
if (centerView != null) {
for(item in 0 until addressRecyclerView.layoutManager.childCount){
val holder: RecyclerView.ViewHolder = addressRecyclerView.findViewHolderForAdapterPosition(item)
holder.itemView.setBackgroundResource(R.drawable.payment_button_inactive)
}
centerView.setBackgroundResource(R.drawable.payment_button_active)
}
}
}
})