Прокрутите фиксированное количество элементов на Fling/ прокрутки до просмотра переработчика
У меня есть простое действие, которое имеет корневой макет. Корневой макет содержит обзор переработчика. Recyclerview будет содержать 20 элементов, созданных из items.xml, который состоит из 3-х текстовых представлений. Здесь items.xml представляют отдельный элемент в recyclerview.
Представление "Переработчик" можно прокручивать в обоих направлениях, оно представляет собой цикл пунктов от 1 до 20.
У меня есть требование сглаживать только 4 элемента, независимо от скорости пролистывания / броска.
Подходы, которые я испробовал, но до сих пор не удалось. Если кто-то может дать какие-либо предложения, это было бы очень полезно.
SnapHelper - кажется, что он привязывает только тот элемент, который находится в центре.
Использование детектора жестов - жесты обнаруживаются для всех действий, но я не могу предотвратить стандартную прокрутку в режиме просмотра.
Основной проблемой является чрезмерная прокрутка окна рециркулятора из-за изменяющихся скоростей пользовательских прокруток и бросков.
Вот мои настройки для детектора жестов.
public myRecyclerTouchListner(final Context context, final RecyclerView recycleView,
final LinearLayoutManager linearLayoutManager,
final ClickListener clicklistener){
final ViewConfiguration vc = ViewConfiguration.get(context);
final int swipeMinDistance = vc.getScaledPagingTouchSlop();
final int swipeThresholdVelocity = vc.getScaledMinimumFlingVelocity();
final int swipeMaxOffPath = vc.getScaledTouchSlop();
this.clicklistener=clicklistener;
simpleGestureDetector =new GestureDetector(context,new GestureDetector.SimpleOnGestureListener( ){
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
Log.d("try", "on Fling called");
if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE &&
Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
//From Right to Left
recycleView.smoothScrollToPosition(linearLayoutManager.
findLastCompletelyVisibleItemPosition() + Constants.spanLength);
return true;
} else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE &&
Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
//From Left to Right
recycleView.smoothScrollToPosition(linearLayoutManager.
findFirstCompletelyVisibleItemPosition() - Constants.spanLength);
return true;
}
return true;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
return true;
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
return false;
}
@Override
public boolean onDown(MotionEvent e) {
return true;
}
@Override
public boolean onDoubleTap(MotionEvent e) {
return true;
}
@Override
public void onLongPress(MotionEvent e) {
Log.d("Try", "Long press gesture");
View child=recycleView.findChildViewUnder(e.getX(),e.getY());
if(child!=null && clicklistener!=null){
clicklistener.onLongClick(child,recycleView.getChildAdapterPosition(child));
}
}
});
2 ответа
Я думаю, что ваша проблема в том, что прокрутка начинается с последней видимой позиции, где обнаружен Флинг, и это все портит.
Попробуйте с глобальной переменной например int lastScrolledPosition = 0
;.
А также OnFling
recycleView.smoothScrollToPosition(lastScrolledPosition + Constants.spanLength);
Я думаю, что это должно сработать. Вы должны изменить, если lastScrolledPosition
Оказывается, мне пришлось использовать Snaphelper для пользовательского поведения прокрутки в случае, когда мне нужен контроль над программной прокруткой и пользовательской прокруткой (переключением).
Это было именно то, что я искал: как привязать элементы RecyclerView, чтобы каждый элемент X рассматривался как единое целое для привязки?
Я надеюсь, что это будет полезно:)