RecyclerView LinearLayout管理器始终在横向模式下返回-1 - findLastCompletelyVisibleItemPosition()

And*_*ast 6 android android-layout android-recyclerview linearlayoutmanager

findLastCompletelyVisibleItemPosition()用来确定我的RecyclerView中的最后一个可见项目.

这是我如何设置布局的代码片段:

    mRecyclerView.setHasFixedSize(true);
    LinearLayoutManager mLayoutManager = new LinearLayoutManager(getContext());
    mRecyclerView.setLayoutManager(mLayoutManager);
Run Code Online (Sandbox Code Playgroud)

布局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>
Run Code Online (Sandbox Code Playgroud)

在纵向模式下,此工作正常,并始终返回正确的位置.

但是在横向模式下,返回的位置始终为-1.

我的问题是:

有谁知道为什么会这样?

我怎样才能覆盖它以返回正确的位置?

或者任何人都可以推荐另一种解决方案来获得最后一个项目在景观中的正确位置?

Che*_*amp 6

您看到的"-1"是RecyclerView.NO_POSITION返回代码,表示在横向模式下您的RecyclerView中没有完全可见的位置."完全可见"表示整个视图包括任何装饰及其边距(垂直方向的上/下边距和水平方向的左/右)是可见的.您可能会看到所有数据,但单个像素可能会在视线之外偷偷溜走.看看findLastCompletelyVisibleItemPosition()它在findOneVisibleChild() 这里的调用.

如上所述,仔细检查您在RecyclerView中是否有100%可见位置.在开发者模式等中显示边距.如果您确认至少有一个完全可见的位置,则会发生其他更神秘的事情.


Max*_*Max 0

您是否尝试过初始化它if (savedInstanceState == null)

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

    // Do nothing   
}
Run Code Online (Sandbox Code Playgroud)