0

Я пытаюсь реализовать CoordinatorLayout с обрушением ToolBar. У меня уже есть SwipeRefreshLayout с RecyclerView внутри. Этот просмотрщик также имеет onScrollListener для загрузки большего количества контента и пользовательского адаптера, чтобы показать загрузку ViewHolder, когда он загружает больше контента.Странное поведение с координаторомLayout + SwipeRefreshLayout + Endless RecyclerView

Все работало нормально, прежде чем я попытался добавить CoordinatorLayout. Теперь у меня есть две проблемы:

  1. При загрузке элементов в первый раз, загрузка ViewHolder показывает вверх, и это хорошо помещены (ниже ToolBar). Когда он заканчивается, загрузка удаляется и элементы добавляются. Проблема в том, что первый элемент скрыт. Это похоже на то, что второй элемент на самом деле первый. Совершенно невозможно увидеть первый элемент, даже если он больше, чем ToolBar. Но когда я использую салфетки для обновления, элемент устанавливается правильно. Я понятия не имею, почему это происходит.

  2. Когда я использую салфетки для обновления, он загружает предметы два раза. Первый раз - нормальная нагрузка, а вторая - нагрузка для большего количества предметов из-за onScrollListener. Однако свиток все еще находится в верхней части списка. Элементы просмотра ресайклеров остаются невидимыми до тех пор, пока я не прокручу (я думаю, это связано с тем, что я только уведомляю адаптер о новых элементах, но мы все еще находимся в верхней части списка).

Однако, я не знаю, что изменить в слушателе, чтобы исправить это.

Вот слушатель:

mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { 
     @Override 
     public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 
      super.onScrolled(recyclerView, dx, dy); 
      if(!adapter.isLoading()) { 
       LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager(); 
       //position starts at 0 
       if (layoutManager.findLastCompletelyVisibleItemPosition() >= layoutManager.getItemCount() - 2) { 
        loadSubmissions(false); 
       } 
      } 
     } 
    }); 

Моя деятельность раскладка:

<android.support.design.widget.CoordinatorLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/coordinatorLayout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <android.support.design.widget.AppBarLayout 
     android:id="@+id/appBarLayout" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 

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

    </android.support.design.widget.AppBarLayout> 

    <android.support.v4.widget.SwipeRefreshLayout 
     android:id="@+id/contentView" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="horizontal" 
     app:layout_behavior="@string/appbar_scrolling_view_behavior"> 

     <android.support.v7.widget.RecyclerView 
      android:id="@+id/recyclerView" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:clipToPadding="false" 
      android:paddingBottom="6dp" 
      android:paddingTop="6dp" 
      android:scrollbars="vertical" 
      app:layout_behavior="@string/appbar_scrolling_view_behavior" /> 

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

</android.support.design.widget.CoordinatorLayout> 

Моя панель инструментов:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v7.widget.Toolbar 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="@color/colorPrimary" 
    android:elevation="4dp" 
    app:layout_scrollFlags="scroll|enterAlways"> 
</android.support.v7.widget.Toolbar> 

ответ

0

Bot h проблемы исправлены. Для первого, когда я удалял загрузку ViewHolder, я фактически делал notifyItemInserted вместо notifyItemRemoved.

Для второй проблемы это потому, что я звоню notifyDatasetChanged, когда я использую салфетки для обновления.

@Override public void onRefresh() { 
    adapter.clear(); 
    adapter.notifyDataSetChanged(); 
    loadSubmissions(true); 
} 

Когда очистить адаптер с салфеткой, чтобы обновить, я ударяя так это означает, что onScrollListener будет называться.

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

mRecyclerView.addOnScrollListener(new EndlessRecyclerOnScrollListener(linearLayoutManager) { 
    @Override 
    public void onLoadMore(int current_page) { 
     // Doesnt load multiples times with the same scroll and doesnt load if there are no items 
     if(!adapter.isLoading() && adapter.getItemCount() > 0) { 
      loadSubmissions(false); 
     } 
    } 
});