Recycler View no se desplaza suavemente

Implementé el siguiente RecyclerViewAdapter con LinearLayoutManager

 class WaterSummaryListAdapter(private var dataList: List<WaterSummaryListItem>): RecyclerView.Adapter<RecyclerView.ViewHolder>() { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { val v = LayoutInflater.from(parent.context) .inflate(R.layout.list_row_water_summary, parent, false) return ItemViewHolder(v) } override fun getItemCount(): Int = dataList.size override fun onBindViewHolder(holder: RecyclerView.ViewHolder?, position: Int) { val dataItem = dataList[position] if (holder is ItemViewHolder){ holder.update(dataItem) } } inner class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { private var date = itemView.itemDateSummaryList private var value = itemView.waterValue fun update(item: WaterSummaryListItem){ this.date.text = item.date this.value.text = item.volume.toString() } } fun changeValueOf(itemNo: Int, value: Float){ dataList[itemNo].volume = value notifyDataSetChanged() } } 

pero cuando se trata de desplazarse, no se desplaza suavemente. Se detiene de repente. Incluso probé .setHasFixedSize(true) pero incluso eso no funciona.

 recyclerView = view.summaryListRecyclerView val manager = LinearLayoutManager(context) adapter = WaterSummaryListAdapter(mSummaryListItems) recyclerView.layoutManager = manager recyclerView.adapter = adapter recyclerView.setHasFixedSize(true) 

Arriba, cómo implementé el adaptador a la vista de reciclador.

Escribir código de peso ligero en el cuerpo del método holder.update(dataItem)

Elimine la condición if en onBindViewHolder y llame al método de actualización directamente

if (el titular es ItemViewHolder) {}

 holder.update(dataItem) 

Debe configurar su layout como se indica a continuación

 recyclerView.layoutManager = LinearLayoutManager(activity, LinearLayout.VERTICAL, false) recyclerView.adapter = MyAdapter(yourList) 

puedes usar SpeedyLinearLayoutManager

 SpeedyLinearLayoutManager linearLayoutManager = new SpeedyLinearLayoutManager(this); linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); Adapter myAdapter = new Adapter(myContext); myRecyclerView.setLayoutManager(linearLayoutManager); myRecyclerView.setAdapter(myAdapter); public class SpeedyLinearLayoutManager extends LinearLayoutManager { private static final float MILLISECONDS_PER_INCH = 6f; //default is 25f // set the speed here public SpeedyLinearLayoutManager(Context context) { super(context); } public SpeedyLinearLayoutManager(Context context, int orientation, boolean reverseLayout) { super(context, orientation, reverseLayout); } public SpeedyLinearLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } @Override public boolean canScrollVertically() { //Similarly you can customize "canScrollHorizontally()" for managing horizontal scroll return CommonUtils.IsContactActivityScrollEnabled && super.canScrollVertically(); } @Override public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) { final LinearSmoothScroller linearSmoothScroller = new LinearSmoothScroller(recyclerView.getContext()) { @Override public PointF computeScrollVectorForPosition(int targetPosition) { return SpeedyLinearLayoutManager.this.computeScrollVectorForPosition(targetPosition); } @Override protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) { return MILLISECONDS_PER_INCH / displayMetrics.densityDpi; } }; linearSmoothScroller.setTargetPosition(position); startSmoothScroll(linearSmoothScroller); } } 

primero que nada necesitas cambiar tu primera línea,

 class WaterSummaryListAdapter(private var dataList: List<WaterSummaryListItem>): RecyclerView.Adapter<RecyclerView.ViewHolder>() 

con

 class WaterSummaryListAdapter(private var dataList: List<WaterSummaryListItem>): RecyclerView.Adapter< WaterSummaryListAdapter.ItemViewHolder>() 

ACTUALIZACIÓN: eliminó la sugerencia innecesaria gracias @ Viktor Yakunin

  • RecyclerView.ViewHolder no se vincula correctamente
  • RecyclerView itemClickListener en Kotlin
  • Desadaptación del tipo de Kotlin: ¡tipo inferido es Ver! pero se esperaba TextView
  • DiffUtils y multi selección
  • Android solo estableceStackFromEnd solo si RecycleView / List es más grande que la pantalla
  • SortedList IndexOutBoundsException: Inconsistencia detectada. La position del artículo no es válida al eliminar el último elemento
  • extensiones kotlin-android en ViewHolder
  • Android Recycler View Horizontal Desplácese hasta el último elemento y muestre el primer elemento