RecyclerView LinearLayout manager siempre devuelve -1 en modo horizontal – findLastCompletelyVisibleItemPosition ()

Estoy usando findLastCompletelyVisibleItemPosition() para determinar el último elemento visible en mi RecyclerView.

Aquí está un fragmento de código de cómo estoy configurando mi diseño:

  mRecyclerView.setHasFixedSize(true); LinearLayoutManager mLayoutManager = new LinearLayoutManager(getContext()); mRecyclerView.setLayoutManager(mLayoutManager); 

Diseño XML:

 <android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/swipe_container" android:layout_width="match_parent" android:layout_height="match_parent"> <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:id="@+id/message_list" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/white" android:paddingBottom="@dimen/footer_progress_bar" android:paddingTop="16dp" android:scrollbars="vertical" /> <ProgressBar android:id="@+id/progress_bar" android:layout_width="50dp" android:layout_height="50dp" android:layout_gravity="center" android:visibility="gone" /> <ProgressBar android:id="@+id/footer_progress_bar" android:layout_width="@dimen/footer_progress_bar" android:layout_height="@dimen/footer_progress_bar" android:layout_gravity="center|bottom" android:visibility="gone" /> </FrameLayout> </android.support.v4.widget.SwipeRefreshLayout> 

En modo retrato, esto funciona bien y siempre devuelve la posición correcta.

Sin embargo, en modo horizontal, la posición devuelta siempre es -1.

Mi pregunta es:

¿Alguien sabe por qué pasa esto?

¿Cómo puedo anular esto para devolver la posición correcta?

¿O alguien puede recomendar otra solución para obtener la posición correcta del último elemento en el paisaje?

El "-1" que está viendo es el código de retorno RecyclerView.NO_POSITION que indica que no hay una posición completamente visible en su RecyclerView en modo horizontal. "Completamente visible" significa que toda la vista incluyendo cualquier decoración y sus márgenes (márgenes superior / inferior para la orientación vertical y izquierda / derecha para las orientaciones horizontales) es visible. Es posible que vea todos sus datos, pero un solo píxel podría quedar fuera de la vista. Eche un vistazo a findLastCompletelyVisibleItemPosition() y su invocación de findOneVisibleChild() aquí .

Compruebe que tiene una posición 100% visible en su RecyclerView como se indica arriba. Mostrar márgenes en el modo de desarrollador, etc. Otra cosa más misteriosa está sucediendo si verifica que hay al menos una posición completamente visible.

Esto sucede porque no hay ningún elemento completamente visible, esto se debe a que no hay elementos mostrados en absoluto, o sus elementos son más grandes que su pantalla y por lo tanto no son completamente visibles.

Debe considerar utilizar el método findLastVisibleItemPosition() para obtener el último elemento visible en la pantalla, aunque esto devolverá la posición del último elemento visible en la pantalla, aunque sea sólo un píxel de ese elemento. No sé si esto llenará sus requisitos, si no, usted puede ser que quiera crear una nueva pregunta con más contexto / detalles sobre sus requisitos.

¿Ha intentado inicializarlo en if (savedInstanceState == null)

 if (savedInstanceState == null){ mRecyclerView.setHasFixedSize(true); LinearLayoutManager mLayoutManager = new LinearLayoutManager(getContext()); mRecyclerView.setLayoutManager(mLayoutManager); } else { // Do nothing } 
  • ¿Cuál es la diferencia entre el método swapadapter y el método notifydatasetchanged en la vista Recycler?
  • Recyclerview addOnItemTouchListener obtiene la vista previa que se hace clic en la fila
  • RecyclerView notifyDataSetChanged se desplaza a la posición superior
  • RecyclerView con LinearLayoutManager con vista de encabezado que no recicla
  • Cargando datos de forma eficaz en RecycleView
  • ¿Por qué utilizar un CardView en lugar de un RelativeLayout o LinearLayout?
  • Diferenciar entre una acción de Drag y una acción de Fling en recyclerview
  • OnClick en el EditText dentro de TextInputLayout, dentro de un RecyclerView
  • Haciendo Recyclerview la altura fija y Scrollable
  • Calcular dinámicamente el tamaño de RecyclerView rellenado con StaggeredGridLayoutManager
  • RecyclerView: obtenga todas las vistas / presentaciones existentes
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.