Хорошо, если кто-то ищет ответ на этот вопрос, вот решение, которое я придумала!Основная настройка состоит в том, что у меня есть FrameLayout
, который содержит ViewFlipper
, и я добавляю GridView
s к ViewFlipper
в зависимости от того, сколько предметов мне нужно показать.I обнаруживает пролистывание FrameLayout
и переключается между GridView
s в ViewFlipper
.Мне все еще нужно иметь возможность щелкать элементы в GridView
, поэтому я не могу просто использовать события в FrameLayout
, но GridView
потребляет все полученные события, поэтому мне пришлось перехватывать события, прежде чем они дойдут доGridView
и отдаю их моему GestureDetector
.
public class PagedGrid extends FrameLayout
{
private Context _context;
private ViewFlipper _flipper;
private GestureDetector _gestureDetector;
public PresentationsGrid(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
LayoutInflater.from(context).inflate(R.layout.presentation_grid, this, true);
_flipper = (ViewFlipper)findViewById(R.id.flipper);
_gestureDetector = new GestureDetector(new GestureListener());
setFocusable(true);
setFocusableInTouchMode(true);
setClickable(true);
_context = context;
// ... Add Pages ...
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event)
{
return _gestureDetector.onTouchEvent(event);
}
@Override
public boolean onTouchEvent(MotionEvent event)
{
_gestureDetector.onTouchEvent(event);
return false;
}
}
Затем я подклассифицировал GridView
, чтобы отслеживать его состояние и разумно передавать события назад.
public class UnNomableGridView extends GridView
{
private boolean _wasDown;
public UnNomableGridView(Context context)
{
super(context);
}
@Override
public boolean onTouchEvent(MotionEvent event)
{
if(!_wasDown && event.getActionMasked() == MotionEvent.ACTION_DOWN)
{
super.onTouchEvent(event);
_wasDown = true;
return true;
}
else if(_wasDown && event.getActionMasked() == MotionEvent.ACTION_UP)
{
super.onTouchEvent(event);
_wasDown = false;
return true;
}
else if(_wasDown && event.getActionMasked() == MotionEvent.ACTION_CANCEL)
{
super.onTouchEvent(event);
_wasDown = false;
return true;
}
else
{
return false;
}
}
}