Estoy atascado en un pequeño problema, donde necesito encontrar el elemento de anclaje del elemento visible del centro del recicladorVer
Por favor, compruebe la imagen de abajo para referencia 
debajo del código que estoy usando para encontrar el elemento central de recyclerView
class CenterItemFinder( private val context: Context, private val layoutManager: LinearLayoutManager, private val callback: CenterItemCallback, private val controlState: Int ) : OnScrollListener() { override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) { if (controlState == ALL_STATES || newState == controlState) { val firstVisible = layoutManager.findFirstVisibleItemPosition() val lastVisible = layoutManager.findLastVisibleItemPosition() val itemsCount = lastVisible - firstVisible + 1 val screenCenter = context.resources.displayMetrics.widthPixels / 2 var minCenterOffset = Int.MAX_VALUE var middleItemIndex = 0 for (index in 0 until itemsCount) { val listItem = layoutManager.getChildAt(index) ?: return val leftOffset = listItem.left val rightOffset = listItem.right val centerOffset = Math.abs(leftOffset - screenCenter) + Math.abs(rightOffset - screenCenter) if (minCenterOffset > centerOffset) { minCenterOffset = centerOffset middleItemIndex = index + firstVisible } } callback.scrollFinished(middleItemIndex) } } interface CenterItemCallback { fun scrollFinished(middleElement: Int) } companion object { const val ALL_STATES = 10 } }Quiero encontrar el elemento de anclaje interno en recyclerView pero no puedo encontrar el elemento interno visible del centro exacto en recyclerView
Puedo encontrar el elemento central visible de RecyclerView pero no puedo encontrar el elemento interno de anclaje
Aquí está el video de referencia para el mismo
https://drive.google.com/file/d/1OIPq-YOFhch6xFpSZGEFZTDHhDisicDg/view?usp=sharing
La idea es que la vista ancla sea la más cercana al centro:
Primero obtenga la posición x del elemento centrado en la pantalla (es decir, el borde izquierdo), agregue el ancho del elemento para obtener el borde derecho; luego compare eso con el punto central de la pantalla para saber qué borde está más cerca del centro.
Pero primero, necesitamos asociar la instancia de ViewHolder a ese elemento centrado para obtener estas posiciones y acceder a las vistas subyacentes.
Ya obtuvo la posición del elemento centrado ( middleItemIndex ) en RecyclerView dentro de la devolución de llamada onScrollStateChanged() . Luego, para obtener la instancia de ViewHolder asociada para esta posición:
val holder = recyclerView.findViewHolderForAdapterPosition(middleItemIndex) as MyViewHolder // Cast that to your ViewHolder class // Get the centered item position on the screen val point = IntArray(2) holder.itemView.getLocationOnScreen(point) // or getLocationInWindow(point) val leftEdge = point[0] val rightEdge = leftEdge + holder.itemView.width val screenCenter = resources.displayMetrics.widthPixels / 2 val leftOffset = Math.abs(leftEdge - screenCenter) val rightOffset = Math.abs(rightEdge - screenCenter) // And eventually get the anchor view: val anchorView = if (leftOffset > rightOffset) { // The right view is the anchor holder.itemView.findViewById<...>(R.id.rightItemId) // adjust rightItemId to your most right view id in the RV item } else { // The left view is the anchor holder.itemView.findViewById<...>(R.id.leftItemId) // adjust leftItemId to your most left view id in the RV item }usando esta condición si (leftOffset > rightOffset) { puedo detectar el primer y último bloque de recyclerview, el problema es que no puedo detectar el elemento del bloque central (el elemento que tiene...)
Puede dividir el elemento centrado en 3 partes iguales, donde habrá dos bordes para comparar con la posición central de la pantalla:
// Get the centered item x,y position on the screen val point = IntArray(2) holder.itemView.getLocationOnScreen(point) // or getLocationInWindow(point) val itemWidth = holder.itemView.width // Divide the width into 3 equal parts (two margins) val leftMargin = point[0] + itemWidth / 3 val rightMargin = point[0] + itemWidth * 2 / 3 val anchorView = when { screenCenter > rightMargin -> { // The anchor is the right item holder.itemView.findViewById<..>(R.id.rightItemId) // adjust rightItemId to the most right view id in the RV item } screenCenter > leftMargin -> { // The anchor is the middle item holder.itemView.findViewById<..>(R.id.middleItemId) // adjust rightItemId to the middle view id in the RV item } else -> { // The anchor is the left item holder.itemView.findViewById<..>(R.id.leftItemId) // adjust rightItemId to the most left view id in the RV item } }