Color de background e image arrastrando en Scroll en recyclerView Android usando Group Adaptor

Debajo está mi Clase BindableItem que también actúa como un adapter mientras usa Groupie

 class FilterByAthleteTypeItem(var athleteResponse: AthleteModel, var onFilterAthleteItemClick: OnFilterAthleteItemClick) : BindableItem<FilterItemLayoutBinding>() { override fun bind(viewBinding: FilterItemLayoutBinding, position: Int) { ViewHolder(viewBinding, position) viewBinding.executePendingBindings() viewBinding.notifyChange() } override fun getLayout(): Int { return R.layout.filter_item_layout } inner class ViewHolder(var binding: FilterItemLayoutBinding, position: Int) : RecyclerView.ViewHolder(binding.root), View.OnClickListener { override fun onClick(p0: View?) { athleteResponse.isChecked = binding.playlistSwitch.isChecked onFilterAthleteItemClick.onFilterAthleteClicked(athleteResponse) notifyChanged() } init { val athleteModel = athleteResponse binding.totalItems.text = athleteModel.areelCount.toString() binding.playlistSwitch.isChecked = athleteModel.isChecked binding.sportName.text = athleteModel.athleteType binding.playlistSwitch.setOnClickListener(this) when { athleteModel.athleteType == "highschool" -> binding.playerLevelImage.setBackgroundColor( ContextCompat.getColor(binding.root.context, R.color.black)) athleteModel.athleteType == "college" -> binding.playerLevelImage.setBackgroundColor( ContextCompat.getColor(binding.root.context, R.color .college)) athleteModel.athleteType == "pro" -> binding.playerLevelImage.setBackgroundColor( ContextCompat.getColor(binding.root.context, R.color.pro)) athleteModel.athleteType == "enthusiast" -> binding.playerLevelImage.setBackgroundColor( ContextCompat.getColor(binding.root.context, R.color.enthusiast)) athleteModel.athleteType == "military" -> binding.playerLevelImage.setBackgroundColor( ContextCompat.getColor(binding.root.context, R.color.text_color_9b)) else -> binding.playerLevelImage.setBackgroundColor( ContextCompat.getColor(binding.root.context, R.color.white)) } } } } interface OnFilterAthleteItemClick { fun onFilterAthleteClicked(athleteModel: AthleteModel) } 

Así es como lo usé en MyActivity

  Section section = new Section(); section.setHeader(headerItemGroupie); if (!Utils.isNull(athleteModelList)) for (int i = 0; i < athleteModelList.size(); i++) { AthleteModel athleteModel = athleteModelList.get(i); athleteModel.setPosition(i); athleteModelList.remove(i); athleteModelList.add(i, athleteModel); section.add(new FilterByAthleteTypeItem(athleteModelList.get(i), this)); } groupAdapter.add(section); 

A continuación está mi file de elementos de layout

 <?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/white" android:orientation="horizontal"> <com.areel.android.customview.CustomTextView android:id="@+id/totalItems" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginStart="28dp" android:layout_weight="1.7" android:paddingBottom="18dp" android:paddingTop="18dp" android:textColor="@color/text_color_9b" android:textSize="12sp" app:fontPath="@string/font_avenir_heavy" app:letterSpacing="0.154" tools:text="14,932"/> <com.areel.android.customview.CustomTextView android:id="@+id/sportName" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginEnd="16dp" android:layout_weight="1" android:gravity="end" android:textAllCaps="true" android:textColor="@color/black" android:textSize="12sp" app:fontPath="@string/font_avenir_heavy" app:letterSpacing="0.3" tools:text="NAME OF SPORT"/> <FrameLayout android:id="@+id/frameLayout" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1.8"> <ImageView android:id="@+id/playerLevelImage" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginStart="21dp" android:scaleType="fitXY"/> <android.support.v7.widget.AppCompatCheckBox android:id="@+id/playlistSwitch" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center" android:button="@drawable/switch_on_off"/> </FrameLayout> </LinearLayout> 

y aquí está mi recyclerView en el layout

  <android.support.v7.widget.RecyclerView android:id="@+id/filter_list_recycler_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/showFriendLayout" android:clipChildren="false" android:clipToPadding="false"> </android.support.v7.widget.RecyclerView> 

Ahora cuando desploop el recyclerView veo el color de background y la image comienza a mezclar significa que las posiciones respectivas del color de background no siguen siendo apropiadas mientras que el principal problema es desplazar el último elemento que tiene una image como background, y cuando desploop esa image se solapa con otros backgrounds y Shuffle pasó Pero ahora hay forma de cambiar esa image a color, así que necesito una solución más robusta !!

Estoy agregando las capturas de pantalla aquí Primera, Lo que hice

Que he hecho

Y compruebo los elementos y desploop la vista recicladora, luego la última image cambia su position como debajo de la image. La cuarta image también se mezcla en el lado inferior.

El problema es

Autor de la biblioteca aquí. Usted tiene varios problemas en su código publicado.

Para empezar, no debería llamar a executePendingBindings o notifyChange . No está utilizando la function de data binding donde vincula un object model, por lo que ambos son innecesarios.

En segundo lugar, el objective de Groupie (especialmente con el data binding) es que no debería tener que crear su propio ViewHolder. De hecho, el tuyo no está haciendo nada. Puede mover todo el código de su class FilterByAthleteTypeItem.bind() a FilterByAthleteTypeItem.bind() .

Por último, su problema con la carga de imágenes en los lugares equivocados, o duplicado, es un problema muy común en RecyclerViews. No publicaste el código de carga de la image, pero supongo que está cargando de forma asíncrona imágenes, es decir, se cargan en una determinada vista, independientemente de si se ha reciclado, y / o no se borró la image anterior de los usuarios reutilizados. Te recomiendo que evites lidiar con este problema completamente usando una biblioteca de carga de imágenes como Picasso o Glide.

¡Espero que ayude!

  • SortedList IndexOutBoundsException: Inconsistencia detectada. La position del artículo no es válida al eliminar el último elemento
  • Extensión de Kotlin no reconocida en el adaptador
  • Llame a getMeasunetworkingWidth () o getWidth () para RecyclerView return 0 en data binding
  • Compruebe si RecyclerView se desplaza hacia arriba (findFirstCompletelyVisibleItemPosition no funcionará)
  • ¿Por qué onclick en los ítems de RecyclerView se devuelve una identificación de artículo incorrecta?
  • Cómo restablecer el contenido de la vista de reciclador en la actividad de llamadas usando Kotlin
  • Recycler View no se desplaza suavemente
  • Android - Kotlin: el object debe declararse abstracto o implementar miembro abstracto
  • ¿Cómo cambiar el color de background de una vista de carta cuando se selecciona?
  • RecyclerView: implementa correctamente la eliminación de SnackBar UNDO (Kotlin)
  • Genéricos para RecyclerView.Adapter Android