studio recyclerview recycler lista libreria imágenes example dependencia crear con cardview card and android listview android-recyclerview android-softkeyboard

android - lista - Recyclerview no se desplaza para finalizar cuando se abre el teclado



dependencia cardview android studio (10)

Agregue esta su actividad o fragmento:

if (Build.VERSION.SDK_INT >= 11) { recyclerView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { @Override public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { if (bottom < oldBottom) { recyclerView.postDelayed(new Runnable() { @Override public void run() { recyclerView.smoothScrollToPosition( recyclerView.getAdapter().getItemCount() - 1); } }, 100); } } }); }

Estoy usando recylerview en mi aplicación y cada vez que se agrega un nuevo elemento a recyclerview, se desplaza al último elemento usando

recyclerView.scrollToPosition(adapter.getCount());

Pero, cada vez que se abre el teclado (debido a editTextView), cambia el tamaño de la vista y la vista de reciclador se hace más pequeña, pero no se puede desplazar al último elemento.

android:windowSoftInputMode="adjustResize"

Incluso intenté usar el siguiente código para desplazarme al último elemento, pero no funcionó

editTextView.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if(hasFocus){ recyclerView.scrollToPosition(chatAdapter.getItemCount()); } } });

Puedo probar adjustPan para cambiar la panorámica, pero está ocultando mi barra de herramientas. Por favor sugiera cualquier forma de rectificar el problema.


Aunque esta es una pregunta antigua, experimenté este problema hoy y descubrí que ninguno de los métodos anteriores funciona. Esta es mi solución

recyclerView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { @Override public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { if (bottom < oldBottom) { final int lastAdapterItem = mAdapter.getItemCount() - 1; recyclerView.post(new Runnable() { @Override public void run() { int recyclerViewPositionOffset = -1000000; View bottomView = linearLayoutManager.findViewByPosition(lastAdapterItem); if (bottomView != null) { recyclerViewPositionOffset = 0 - bottomView.getHeight(); } linearLayoutManager.scrollToPositionWithOffset(lastAdapterItem, recyclerViewPositionOffset); } }); } }); }


Encontré que la publicación PostDelay es innecesaria y el uso de posiciones de adaptador no cuenta cuando la recicladora se desplaza a algún lugar en medio de un artículo. Logré la apariencia que quería con esto.

recycler.addOnLayoutChangeListener((v, left, top, right, bottom, oldLeft, oldTop, xoldRight, oldBottom) -> { if (bottom < oldBottom) { messageRecycler.scrollBy(0, oldBottom - bottom); } });


Enlace el RecyclerView dentro de NestedScrollView

<android.support.v4.widget.NestedScrollView android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="wrap_content"/> </android.support.v4.widget.NestedScrollView>


Esto funciona para mi

LinearLayoutManager layoutManager = new LinearLayoutManager(context); layoutManager.setStackFromEnd(true); recyclerView.setLayoutManager(layoutManager);


Esto funciona.

private RecyclerView mRecyclerView; private RecyclerView.Adapter mAdapter; private LinearLayoutManager mManager; ... mManager = new LinearLayoutManager(this); mRecyclerView.setLayoutManager(mManager); (initialize and set adapter.) mRecyclerView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { @Override public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { if (bottom < oldBottom) scrollToBottom(); } }); private void scrollToBottom() { mManager.smoothScrollToPosition(mRecyclerView, null, mAdapter.getItemCount()); }


Funciona correctamente en la biblioteca de soporte versión 27.0.1

No hay nada que establecer en el manifiesto.

val currentScrollPosition = 0 recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() { override fun onScrolled(recyclerView: RecyclerView?, dx: Int, dy: Int) { super.onScrolled(recyclerView, dx, dy) currentScrollPosition = recyclerView.computeVerticalScrollOffset() + recyclerView.computeVerticalScrollExtent() } override fun onScrollStateChanged(recyclerView: RecyclerView?, newState: Int) { } }) storyList.addOnLayoutChangeListener { view, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom -> if (bottom < oldBottom) { if (currentScrollPosition >= recyclerView.computeVerticalScrollRange()) { recyclerVIew.post { recyclerView.overScrollMode = RecyclerView.OVER_SCROLL_NEVER recyclerView.smoothScrollBy(0, recyclerView.computeVerticalScrollRange() - recyclerView.computeVerticalScrollOffset() + recyclerView.computeVerticalScrollExtent()) } } } else { recyclerView.overScrollMode = RecyclerView.OVER_SCROLL_ALWAYS } }


Puede capturar los cambios de teclado utilizando recyclerview.addOnLayoutChangeListener() . Si bottom es más pequeño que oldBottom , el teclado está en estado activo.

if ( bottom < oldBottom) { recyclerview.postDelayed(new Runnable() { @Override public void run() { recyclerview.scrollToPosition(bottomPosition); } }, 100); }


layoutManager.scrollToPositionWithOffset (chatMessageAdapter.getItemCount () - 1, 0);


recyclerView.smoothScrollToPosition(recyclerView.getAdapter().getItemCount());