Ответ 1
Google только что опубликовал обходной путь для этой ошибки, он будет опубликован позже.
https://gist.github.com/chrisbanes/8391b5adb9ee42180893300850ed02f2
Я столкнулся с необычным поведением с RecyclerView как вторым потомком CoordinatorLayout, сразу после AppBarLayout (как описано во многих примерах).
Моя проблема заключается в том, когда я просматриваю представление recycler, и я хочу щелкнуть по определенному элементу. Иногда мне нужно нажать 2 раза, чтобы выбрать этот элемент, он, похоже, связан с поведением. Например, если я прокручиваю нижнюю часть списка ресайклеров, тогда, если я отброшу палец от нижней части экрана до вершины (чтобы увидеть больше данных, но в моем случае я не вижу больше данных, так как я я уже на дно), а затем быстро нажимаю на элемент, он, кажется, останавливает бросок, а второй клик фактически выбирает элемент... Такое поведение явно не происходит при использовании простого вида ресайклинга без CoordinatorLayout.
Мой recyclerview просто держит простой список String и использует следующее поведение макета: @string/appbar_scrolling_view_behavior
Вы знаете, почему?
[EDIT] Я только что попробовал с прокруткой Android Studio образец, и похоже, что это ошибка из репозитория поддержки Google. Фактически, при использовании версии поддержки 26.1.O (то же самое с 26.0.0 и 26.0.2), ошибка, о которой я говорю, присутствует, но если вы попробуете с версией 26.0.0-alpha1 или 26.0.0-beta1, он фактически работает...
В Google есть две открытые ошибки: https://issuetracker.google.com/u/1/issues/66996774 https://issuetracker.google.com/u/1/issues/68077101
Пожалуйста, отметьте эти ошибки, если вы столкнулись с одной и той же проблемой
Google только что опубликовал обходной путь для этой ошибки, он будет опубликован позже.
https://gist.github.com/chrisbanes/8391b5adb9ee42180893300850ed02f2
Я также нашел эту проблему... после того, как я потратил столько времени на поиск и пробую разные вещи, я вышел с трюком, его не очень, но он может работать и на кого-то другого.
В принципе идея имитирует щелчок по вложенномуScrollView.
В моем случае после того, как я обнаружил, что "AppBarLayout" полностью расширен, я посылаю кран к вложенному.
protected void onCreate(final Bundle savedInstanceState) {
getAppBarLayout().addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
@Override
public void onOffsetChanged(final AppBarLayout appBarLayout, final int verticalOffset) {
if (verticalOffset == 0) {
// State.EXPANDED
simulatedClick(nestedScroll)
} else if (Math.abs(verticalOffset) >= appBarLayout.getTotalScrollRange()) {
// State.COLLAPSED
} else {
// State.IDLE
}
}
});
}
private void simulatedClick(@NonNull final View view) {
// Obtain MotionEvent object
final long downTime = SystemClock.uptimeMillis();
final long eventTime = SystemClock.uptimeMillis() + 100;
final MotionEvent motionEvent = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_UP, 0.0f, 0.0f, 0);
// Dispatch touch event to view
view.dispatchTouchEvent(motionEvent);
}
ПРИМЕЧАНИЕ. Я действительно не рекомендую использовать такие хаки, это непрофессионально и не поддаётся контролю, но чем больше вы знаете...
если с помощью RecyclerView в NestedScrollView добавьте эту строку в RecyclerView:
android:nestedScrollingEnabled="false"
Я надеюсь, что это поможет вам.