I'm using findLastCompletelyVisibleItemPosition()
to determine the last visible item in my RecyclerView.
Here is a code snippet of how I'm setting up my layout:
mRecyclerView.setHasFixedSize(true);
LinearLayoutManager mLayoutManager = new LinearLayoutManager(getContext());
mRecyclerView.setLayoutManager(mLayoutManager);
Layout 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>
In portrait mode, this works fine and always returns the right position.
However in landscape mode, the position returned is always -1.
My question is:
Does anyone know why this happens?
How I can override this to return the right position?
Or can anyone recommend another solution to get the right position of the last item in landscape?
The "-1" that you are seeing is the RecyclerView.NO_POSITION
return code indicating that there
is no completely visible position in your RecyclerView in landscape mode. "Completely visible" means that the entire
view including any decorations and its margins (top/bottom margins for vertical orientation and left/right
for horizontal orientations) is visible. You may see all of your data, but a single pixel could be sneaking off out
of view. Take a look at findLastCompletelyVisibleItemPosition()
and its
invocation of findOneVisibleChild()
here.
Double check that you have a 100% visible position in your RecyclerView as outlined above. Show margins in developer mode, etc. Something else more mysterious is going on if you verify that there is at least one completely visible position.
This is happening because there is no item completely visible, this is caused because either there are no items shown at all, or your items are bigger than your screen and therefore are not completely visible.
You should consider using the findLastVisibleItemPosition()
method to get the last visible item on the screen, altho this will return the position of the last item that is visible on the screen, even if it's only one pixel of that item. I don't know if this will forfill your requirements, if not, you might wanna create a new question with more context/details about your requirements.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With