Получение атрибута scrollY из RecycleView с помощью CardList внутри адаптера ViewPager с макетом SwipeToRefresh

Итак, я пытаюсь получить атрибут scrollY из моего RecycleView (чтобы увидеть позицию, в которой я прокручиваю в CardList. У меня есть следующая настройка

Во-первых, основное действие, в котором находится макет SlidingTabs, который имеет макет SwipeToFresh в качестве дочернего элемента и ViewPager для 2 фрагментов вкладок, например:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.popal.soul.MovieListActivity">

<com.example.popal.soul.SlidingTabLayout
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:elevation="2dp"
android:background="@color/ColorPrimary"/>


<android.support.v4.widget.SwipeRefreshLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/swipeContainer"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v4.view.ViewPager
        android:id="@+id/pager"
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        android:layout_weight="1">

    </android.support.v4.view.ViewPager>

</android.support.v4.widget.SwipeRefreshLayout>


</LinearLayout>

Затем у меня есть каждый фрагмент с идентичным макетом, например, с RecycleView :

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/cardList"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <ProgressBar
        android:id="@+id/progress_bar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true" />
</RelativeLayout>

И, наконец, макет для каждой карты RecycleView (я не думаю, что это имеет значение, но я все равно добавлю его)

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
xmlns:card_view="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/card_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
card_view:cardCornerRadius="4dp"
android:layout_margin="5dp">

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="?android:attr/selectableItemBackground">
    <TextView
        android:id="@+id/title"
        android:layout_width="match_parent"
        android:layout_height="20dp"
        android:background="@color/bkg_card"
        android:text="Movie Title"
        android:gravity="center_vertical"
        android:textColor="@android:color/white"
        android:textSize="14dp"/>

    <ImageView
        android:elevation="5dp"
        android:scaleType="fitCenter"
        android:layout_width="100dp"
        android:layout_height="150dp"
        android:id="@+id/imageViewPoster"
        android:text="Poster"
        android:gravity="center_vertical"
        android:layout_below="@id/title"
        android:layout_marginTop="10dp"
        android:layout_marginLeft="5dp"/>

    <ImageView
        android:id="@+id/imageViewFanart"
        android:scaleType="fitCenter"
        android:layout_alignBottom="@+id/imageViewPoster"
        android:layout_toEndOf="@+id/imageViewPoster"
        android:layout_width= "235dp"
        android:layout_height="122dp"
        android:layout_marginRight="5dp"/>

 </RelativeLayout>

 </android.support.v7.widget.CardView>

Теперь я пытаюсь получить позицию прокрутки элементов RecycleView из основного действия, где определен макет SwipeToRefresh. Мне нужно сделать это, чтобы реализовать этот обходной путь в отношении ошибки в макете SwipeToRefresh, где попытка прокрутки вверх из нижней части списка вызовет вызов обновления: SwipeRefreshLayout + WebView, когда позиция прокрутки находится вверху , но, как видите, оба решения требуют доступа к Swipe Container и RecycleView, в тот же класс или вид деятельности.

Я пытался использовать что-то вроде int scrollY = pager.getChildAt(pager.getCurrentItem()).getScrollY();

Который теоретически должен возвращать позицию дочернего элемента (в данном случае RecycleView), но он по-прежнему возвращает 0 (добавлены записи журнала для получения событий в реальном времени при изменении состояния прокрутки), например, если бы все еще возвращалась позиция адаптер ViewPage.

У кого-нибудь есть идея?


comment
Вы можете определить простой интерфейс слушателя, который реализует активность хостинга и через который отдельные фрагменты могут затем передавать свою позицию прокрутки RecyclerView. Эта концепция описана здесь более подробно с некоторым примером кода.   -  person MH.    schedule 27.09.2015
comment
Вы правы, комбинация вашего ответа + некоторые модификации - это именно то, что мне нужно. Видите ли, не getScrollY(); возвращает позицию в списке, а прослушиватель OnScrollListener для RecycleView, который я затем могу переопределить внутри него методом public void onScrolled(RecyclerView recycleList, int dx, int dy) с помощью этого int position = ((LinearLayoutManager) recycleList.getLayoutManager()).findFirstVisibleItemPosition();. position вернет текущую позицию прокрутки, и в сочетании с вашим ответом я смогу включить ее в свою основную деятельность. Большое спасибо.   -  person Alex    schedule 28.09.2015
comment
Вы можете добавить свой комментарий в качестве ответа, когда у вас будет время, чтобы я мог пометить вопрос как отвеченный, чтобы вы могли получить очки репутации. Большое спасибо еще раз.   -  person Alex    schedule 28.09.2015
comment
Упс, совсем забыл об этом. Я добавил суть исходного комментария в качестве ответа. Не стесняйтесь обновлять код, который у вас получился, если вы считаете, что он может быть полезен другим.   -  person MH.    schedule 06.10.2015


Ответы (1)


Согласно предыдущему комментарию: вы можете определить простой интерфейс прослушивателя, который реализует действие хостинга и через который отдельные фрагменты могут затем передавать свою позицию прокрутки RecyclerView (из своего собственного локального OnScrollListener).

Эта концепция взаимодействия с фрагментами описана здесь более подробно с некоторым примером кода‌​.

person MH.    schedule 06.10.2015