Фон
У нас довольно сложная компоновка, в которой есть CollapsingToolbarLayout, вместе с RecyclerView внизу.
В некоторых случаях мы временно отключим расширение/сбой CollapsingToolbarLayout, вызвав setNestedScrollingEnabled (boolean) в RecyclerView.
Проблема
Обычно это нормально.
Однако, в некоторых (бит редких) случаях медленная прокрутка в RecyclerView получает полублокировку, то есть она пытается прокрутить назад при прокрутке вниз. Как будто он имеет 2 прокрутки, которые сражаются друг с другом (прокрутите вверх и прокрутите вниз):
Код для запуска этого типа таков:
Рез/макет/activity_scrolling.xml
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context="com.example.user.myapplication.ScrollingActivity">
<android.support.design.widget.AppBarLayout
android:id="@+id/app_bar"
android:layout_width="match_parent"
android:layout_height="@dimen/app_bar_height"
android:fitsSystemWindows="true"
android:theme="@style/AppTheme.AppBarOverlay">
<android.support.design.widget.CollapsingToolbarLayout
android:id="@+id/toolbar_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
app:contentScrim="?attr/colorPrimary"
app:layout_scrollFlags="scroll|exitUntilCollapsed|snap">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:layout_collapseMode="pin"
app:popupTheme="@style/AppTheme.PopupOverlay"/>
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<android.support.v7.widget.RecyclerView
android:id="@+id/nestedView"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_anchor="@id/app_bar"
app:layout_anchorGravity="bottom|end">
<Button
android:id="@+id/disableNestedScrollingButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="disable"/>
<Button
android:id="@+id/enableNestedScrollingButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="enable"
/>
</LinearLayout>
</android.support.design.widget.CoordinatorLayout>
ScrollingActivity.java
public class ScrollingActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_scrolling);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
final RecyclerView nestedView = (RecyclerView) findViewById(R.id.nestedView);
findViewById(R.id.disableNestedScrollingButton).setOnClickListener(new OnClickListener() {
@Override
public void onClick(final View v) {
nestedView.setNestedScrollingEnabled(false);
}
});
findViewById(R.id.enableNestedScrollingButton).setOnClickListener(new OnClickListener() {
@Override
public void onClick(final View v) {
nestedView.setNestedScrollingEnabled(true);
}
});
nestedView.setLayoutManager(new LinearLayoutManager(this));
nestedView.setAdapter(new Adapter() {
@Override
public ViewHolder onCreateViewHolder(final ViewGroup parent, final int viewType) {
return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(
android.R.layout.simple_list_item_1,
parent,
false)) {
};
}
@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
((TextView) holder.itemView.findViewById(android.R.id.text1)).setText("item " + position);
}
@Override
public int getItemCount() {
return 100;
}
});
}
}
Что я пробовал
Сначала я подумал об этом из-за чего-то другого (я подумал, что это странная комбинация с DrawerLayout), но затем я нашел минимальный образец, чтобы показать его, и он так же, как я думал: все это из-за setNestedScrollingEnabled.
Я попытался сообщить об этом на веб-сайте Google ( здесь), надеясь, что он будет исправлен, если он реальный ошибка. Если вы хотите попробовать или посмотреть видео с проблемой, перейдите туда, так как я не могу загрузить их все здесь (слишком большое и слишком много файлов).
Я также пытался использовать специальные флаги, как указано в других сообщениях (примеры: здесь, здесь, здесь, здесь и здесь), но никто не помог. На самом деле у каждого из них была проблема, будь она в расширенном режиме или прокрутка по-другому, чем то, что я делаю.
Вопросы
-
Это известная проблема? Почему это происходит?
-
Есть ли способ преодолеть это?
-
Есть ли альтернатива для вызова этой функции setNestedScrollingEnabled? Один без каких-либо проблем с прокруткой или блокировкой состояния CollapsingToolbarLayout?