5

У меня есть активность, которая состоит из панели инструментов и плейера представления. Его схема выглядит следующим образом:SwipeRefreshLayout внутри ViewPager

<FrameLayout 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"> 

<android.support.v4.view.ViewPager 
    android:id="@+id/pager" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingTop="112dp" 
    android:layout_gravity="bottom" 
    tools:context=".Rhino68PanelActivity" /> 

<LinearLayout 
    android:id="@+id/toolbarContainer" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical"> 

    <include 
     android:id="@+id/app_bar" 
     layout="@layout/app_bar" /> 

    <include 
     android:id="@+id/tap_strip" 
     layout="@layout/tab_strip" /> 

</LinearLayout> 

я затем загрузить два фрагмента в поле зрения пейджера. Каждый фрагмент содержит свой собственный SwipeRefreshLayout. Я покажу одну фрагменты макета:

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

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:weightSum="12" 
    tools:context=".Rhino68PanelActivity$DummySectionFragment"> 
    ...   
    <android.support.v7.widget.RecyclerView 
    android:id="@+id/recyclerView_panel_status" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:clipToPadding="false" /> 

</LinearLayout> 

Теперь, когда я запускаю деятельность это, кажется, работает. Однако я заметил, что это горизонтально (т.е. перейти на следующую вкладку). Это инициирует swipeRefreshLayout OnRefreshListener

 mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { 
      @Override 
      public void onRefresh() { 
       mSwipeRefreshLayout.setRefreshing(true); 
       DoUpdate(); 
      } 
     }); 

Я также испытываю странное визуальное поведение, когда я стараюсь и делать обновление. Знак загрузки (крутящий круг) часто не отображается, и он иногда показывает, но остается маленьким. Я не уверен, что это также является причиной того, что два взгляда противоречат друг другу.

Есть ли способ, которым я могу исправить эту проблему. Я не уверен, как это сделать. Может быть, ограничив SwipeRefreshLayout, чтобы слушать только вертикальные щелчки?

Любые предложения будут очень благодарны.

+1

У меня нет этой проблемы внутри моего проекта, который также использует аналогичную структуру. Можете ли вы опубликовать образец проекта, который воспроизводит эту проблему? – corsair992

+0

Не могли бы вы поделиться своим макетом? Неужели два макета будут мешать друг другу? Если бы я даже нажал кнопку «SwipeRefreshLayout», это вызовет 'OnRefresh()' – Zapnologica

+1

. Перед тем, как любая из этих «ViewGroup» возьмет событие касания, есть интервал отвала, и определяется, было ли перетаскивание более вертикальным или горизонтальным , Как только событие касания захватывается «ViewGroup», он продолжает обрабатывать событие без помех (используя метод 'requestDisallowInterceptTouchEvent()»). Мое приложение и макет довольно сложны, а также конфиденциальны, это поможет, если вы сможете опубликовать проект с минимальной выборкой с этой проблемой (чтобы я мог ее отлаживать). – corsair992

ответ

1

Это потому, что в SwipeRefreshLayout есть ошибка! Ошибка «onRefresh не работает должным образом, если onMeasure не вызывается» Вы должны расширять SwipeRefreshLayout, как это!

public class SwipeRefreshLoading extends SwipeRefreshLayout { 
    public SwipeRefreshLoading(Context context) { 
     super(context, null); 
    } 

    public SwipeRefreshLoading(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    private boolean mMeasured = false; 
    private boolean mPreMeasureRefreshing = false; 

    @Override 
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
     if (!mMeasured) { 
      mMeasured = true; 
      setRefreshing(mPreMeasureRefreshing); 
     } 
    } 


    @Override 
    public void setRefreshing(boolean refreshing) { 
     if (mMeasured) { 
      super.setRefreshing(refreshing); 
     } else { 
      mPreMeasureRefreshing = refreshing; 
     } 
    } 
} 
+0

Спасибо! У меня RefreshLayout внутри ViewPager и 'setRefreshing' внутри" страницы "(это был фрагмент в моем случае) не работает по некоторым причинам. Кстати, я использую ваш фрагмент кода, и у меня немного неправильная позиция освежающего счетчика. Если вы переместите логику с 'onMeasure' на метод onLayout', позиция будет правильной. – IlyaEremin

+0

@IlyaEremin У меня проблема с vievpager с refreshlayout - когда i triger onrefresh * setrefresg (false) в первом фрагменте viewpager, тогда анимация ушла (ее нормально), но во второй фрагментарной анимации все еще играет даже я назвал setrefreshinng (false) - Я расширил макет, как указано выше, - также переместился в onlayout, но все равно никакого эффекта не попробовал post delayed on layout - возможно, я должен добавить setrefresh к выложенному? – ceph3us

+0

@ TomaszBest это глупый вопрос, но я прошу. Вы назвали 'setRefreshing (false)' для второго фрагмента 'SwipeRefreshLayout'? – IlyaEremin

3

У меня также была эта глупая проблема. Кажется, это ошибка в SwipeRefreshLayout. В качестве обходного пути мне пришлось удалить все его дочерние представления в методе Fragment.onDestroyView().

public SwipeRefreshLayout mSwipeRefreshLayout; 
... 

@Override public void onDestroyView() { 
    mSwipeRefreshLayout.removeAllViews(); 
    super.onDestroyView(); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^