2014-10-07 3 views
2

У меня есть viewpager с 2 до 4 страницами. На одной из этих страниц представлены данные в виде таблицы. Для этого я использую вертикальную прокрутку и горизонтальную прокрутку.horizontalscrollview внутри viewpager

Из-за конфликтов между horizontalscrollview и viewpager, иногда прокрутка ничего не делает.

Я хочу прокрутить страницу, пока она прокручивается влево. Когда он достигнет края, другой жестом салфетки заставит его изменить страницу пейджера просмотра, следуя указаниям от http://developer.android.com/design/patterns/swipe-views.html , где говорится: «Если представление содержит контент, который превышает ширину экрана, например широкое сообщение электронной почты, убедитесь, что начальные прокрутки пользователя будут прокручиваться по горизонтали в пределах представления. После достижения контента дополнительный салфетки должен перейти к следующему виду. Кроме того, поддерживайте использование краевых прокруток, чтобы сразу перемещаться между представлениями, когда контент прокручивается по горизонтали ».

Как я могу это достичь?

+0

Это может быть сложно. Требуется написание пользовательских сенсорных прослушивателей и использование инструкции requestDisallowInterceptTouchEvent. Посмотрите, как это делается в библиотеке PhotoView (она может перемещаться с помощью ViewPager) https://github.com/chrisbanes/PhotoView – httpdispatch

ответ

2

В конце концов, я сделал пользовательский пейджер и перекрытый метод canScroll как так

@Override 
protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) { 
    if (v instanceof HorizontalScrollView) { 
     HorizontalScrollView scroll = (HorizontalScrollView) v; 

     int vScrollX = scroll.getScrollX(); 
     TableLayout table = (TableLayout) scroll.getChildAt(scroll 
       .getChildCount() - 1); 
     int diff = (table.getRight() - (scroll.getWidth() 
       + scroll.getScrollX() + table.getLeft())); 

     if (vScrollX == 0 && diff <= 0) {// table without scroll 
      if (dx > 20 && this.getCurrentItem() > 0) { 
       this.setCurrentItem(this.getCurrentItem() - 1, true); 
      } else if (dx < -20 
        && this.getCurrentItem() + 1 < this.getChildCount()) { 
       this.setCurrentItem(this.getCurrentItem() + 1, true); 
      } 
      return false; // change page 
     } 
     if (vScrollX == 0 && dx > 20) {// left edge, swiping right 
      if (this.getCurrentItem() > 0) { 
       this.setCurrentItem(this.getCurrentItem() - 1, true); 
      } 
      return false; // change page 
     } 
     if (vScrollX == 0 && dx < -20) {// left edge, swiping left 
      return true;// scroll 
     } 
     if (diff <= 0 && dx > 20) {// right edge, swiping right 
      return true;// scroll 
     } 
     if (diff <= 0 && dx < -20) {// right edge, swiping left 
      if (this.getCurrentItem() + 1 < this.getChildCount()) { 
       this.setCurrentItem(this.getCurrentItem() + 1, true); 
      } 
      return false;// change page 
     } 
    } 
    return super.canScroll(v, checkV, dx, x, y); 
} 
Смежные вопросы