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

烈酒焚心 提交于 2019-12-06 01:49:27

问题


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?


回答1:


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.




回答2:


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.




回答3:


Have you tried initializing it in if (savedInstanceState == null)

if (savedInstanceState == null){
    mRecyclerView.setHasFixedSize(true);
    LinearLayoutManager mLayoutManager = new LinearLayoutManager(getContext());
    mRecyclerView.setLayoutManager(mLayoutManager);
} else {

    // Do nothing   
}


来源:https://stackoverflow.com/questions/37113812/recyclerview-linearlayout-manager-always-returns-1-in-landscape-mode-findlast

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!