Это - приложение, которое я пытаюсь создать со всеми элементами, планировавшими ниже:
Все работает, однако, я хочу, чтобы внутренний горизонтальный recyclerview не получил любую из вертикальных прокруток. Все вертикальные прокрутки должны пойти к внешнему вертикальному recyclerview, не горизонтальный, так, чтобы вертикальная прокрутка позволила бы, чтобы панель инструментов вышла из представления согласно, он - scrollFlag.
Когда я указал на "часть" Завода StrawBerry recyclerview и прокрутки, это прокручивает панель инструментов:
Если я указал на горизонтальный scrollview и прокрутку, это не прокручивает панель инструментов вообще.
Следующее является моим xml кодом расположения до сих пор.
Действие xml расположение:
"Фруктовый" фрагмент xml расположение (который является кодом для фрагмента - фрагмент маркирован в вышеупомянутом изображении):
Я использовал пользовательский класс под названием VerticallyScrollRecyclerView, который следует примеру Google обработки сенсорных событий в viewgroup. Его цель состоит в том, чтобы прервать и использовать все вертикальные события прокрутки так, чтобы она прокрутила в / панель инструментов: http://developer.android.com/training/gestures/viewgroup.html
Код для VerticallyScrollRecyclerView ниже:
public class VerticallyScrollRecyclerView extends RecyclerView {
public VerticallyScrollRecyclerView(Context context) {
super(context);
}
public VerticallyScrollRecyclerView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public VerticallyScrollRecyclerView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
ViewConfiguration vc = ViewConfiguration.get(this.getContext());
private int mTouchSlop = vc.getScaledTouchSlop();
private boolean mIsScrolling;
private float startY;
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
final int action = MotionEventCompat.getActionMasked(ev);
// Always handle the case of the touch gesture being complete.
if (action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_UP) {
// Release the scroll.
mIsScrolling = false;
startY = ev.getY();
return super.onInterceptTouchEvent(ev); // Do not intercept touch event, let the child handle it
}
switch (action) {
case MotionEvent.ACTION_MOVE: {
Log.e("VRecView", "its moving");
if (mIsScrolling) {
// We're currently scrolling, so yes, intercept the
// touch event!
return true;
}
// If the user has dragged her finger horizontally more than
// the touch slop, start the scroll
// left as an exercise for the reader
final float yDiff = calculateDistanceY(ev.getY());
Log.e("yDiff ", ""+yDiff);
// Touch slop should be calculated using ViewConfiguration
// constants.
if (Math.abs(yDiff) > 5) {
// Start scrolling!
Log.e("Scroll", "we are scrolling vertically");
mIsScrolling = true;
return true;
}
break;
}
}
return super.onInterceptTouchEvent(ev);
}
private float calculateDistanceY(float endY) {
return startY - endY;
}
}
"Любимое" расположение, которое является recyclerview в вертикальном recyclerview:
Это прослушивало меня некоторое время теперь, и мне не удалось предложить решение. Кто-либо знает, как решить эту проблему?
5 точек к Griffindor для корректного ответа и конечно, репутация указывает на ТАК.
если кто-либо все еще взгляд, попробуйте это:
private val Y_BUFFER = 10
private var preX = 0f
private var preY = 0f
mView.rv.addOnItemTouchListener(object : RecyclerView.OnItemTouchListener {
override fun onTouchEvent(p0: RecyclerView, p1: MotionEvent) {
}
override fun onInterceptTouchEvent(rv: RecyclerView, e: MotionEvent): Boolean {
when (e.action) {
MotionEvent.ACTION_DOWN -> rv.parent.requestDisallowInterceptTouchEvent(true)
MotionEvent.ACTION_MOVE -> {
if (Math.abs(e.x - preX) > Math.abs(e.y - preY)) {
rv.parent.requestDisallowInterceptTouchEvent(true)
} else if (Math.abs(e.y - preY) > Y_BUFFER) {
rv.parent.requestDisallowInterceptTouchEvent(false)
}
}
}
preX = e.x
preY = e.y
return false
}
override fun onRequestDisallowInterceptTouchEvent(p0: Boolean) {
}
})
это проверяет, если текущая прокрутка горизонтального затем не позволяет родителя handel событию