Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

RecyclerView LinearLayout manager always returns -1 in landscape mode - findLastCompletelyVisibleItemPosition()

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?

like image 607
AndroidEnthusiast Avatar asked May 09 '16 10:05

AndroidEnthusiast


2 Answers

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.

like image 81
Cheticamp Avatar answered Oct 17 '22 17:10

Cheticamp


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.

like image 4
Jeffalee Avatar answered Oct 17 '22 16:10

Jeffalee