Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

225
Views
Restringir el desplazamiento del usuario en RecyclerView

En mi proyecto, uso un RecyclerView que solo quiero desplazar llamando al método startSmoothScroll() de LayoutManager:

 private fun next(){ val layoutManager = pager.layoutManager as BattlePageLayoutManager layoutManager.startSmoothScroll(smoothScroller(layoutManager.findFirstVisibleItemPosition() + 1)) layoutManager.finishScroll() }

No quiero que el usuario pueda desplazarse manualmente, por ejemplo, deslizando el dedo.

Ya traté de lograr esto anulando el método onInterceptTouchEvent() del FrameLayout principal.

 override fun onInterceptTouchEvent(ev: MotionEvent): Boolean { if (ev.actionMasked == MotionEvent.ACTION_DOWN){ startClickTime = System.currentTimeMillis() startX = ev.x startY = ev.y } val allowEvent = (System.currentTimeMillis() - startClickTime) < 1000 && (startX-ev.x).absoluteValue < 15 && (startY-ev.y).absoluteValue < 15 return !allowEvent }

Eso funcionó básicamente, pero ocurrió que después de tocar dos veces la Vista, los usuarios pueden desplazarse por sí mismos.

¿Tienes alguna otra idea para abordar esto?

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

¿Intentó anular el método canScrollVertical() en el LayoutManager?

 mLayoutManager = new LinearLayoutManager(getActivity()) { @Override public boolean canScrollVertically() { return false; } };

Editar: cree su propia implementación de RecyclerView que deshabilita el evento táctil mientras se realiza el desplazamiento. Luego, debe cambiar la clase RecyclerView en el archivo xml y Fragment/Activity con él.

Encuentre aquí un ejemplo en Kotlin

 class MyRecyclerView : RecyclerView { constructor(context: Context) : super(context) {} constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {} constructor(context: Context, attrs: AttributeSet?, defStyle: Int) : super(context, attrs, defStyle) {} override fun onInterceptTouchEvent(e: MotionEvent): Boolean { return if (scrollState != RecyclerView.SCROLL_STATE_IDLE) false else super.onInterceptTouchEvent(e) } }

y en Java

 public class MyRecyclerView extends RecyclerView { public MyRecyclerView(Context context) { super(context); } public MyRecyclerView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); } public MyRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public boolean onInterceptTouchEvent(MotionEvent e) { if(getScrollState() != SCROLL_STATE_IDLE) return false; return super.onInterceptTouchEvent(e); } }
over 4 years ago · Santiago Trujillo Report

0

Es posible que desee bloquear la interacción del usuario con RecyclerView , no con FrameLayout en sí.

Compruebe RecyclerView.OnItemTouchListener .

En su RecyclerView , puede implementar OnItemTouchListener y anular todos los métodos para no hacer nada.

Eso bloqueará la interacción del usuario con RecyclerView , haciendo que el desplazamiento no suceda.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!