protected override int GetNextPosition(int position, FlexibleView.LayoutManager.Direction direction) { if (mOrientation == HORIZONTAL) { switch (direction) { case FlexibleView.LayoutManager.Direction.Left: if (position > 0) { return(position - 1); } break; case FlexibleView.LayoutManager.Direction.Right: if (position < ItemCount - 1) { return(position + 1); } break; } } else { switch (direction) { case FlexibleView.LayoutManager.Direction.Up: if (position > 0) { return(position - 1); } break; case FlexibleView.LayoutManager.Direction.Down: if (position < ItemCount - 1) { return(position + 1); } break; } } return(NO_POSITION); }
// Converts a focusDirection to orientation. // // @param focusDirection One of {@link View#FOCUS_UP}, {@link View#FOCUS_DOWN}, // {@link View#FOCUS_LEFT}, {@link View#FOCUS_RIGHT}, // {@link View#FOCUS_BACKWARD}, {@link View#FOCUS_FORWARD} // or 0 for not applicable // @return {@link LayoutState#LAYOUT_START} or {@link LayoutState#LAYOUT_END} if focus direction // is applicable to current state, {@link LayoutState#INVALID_LAYOUT} otherwise. private int ConvertFocusDirectionToLayoutDirection(FlexibleView.LayoutManager.Direction focusDirection) { switch (focusDirection) { case FlexibleView.LayoutManager.Direction.Up: return(mOrientation == VERTICAL ? LayoutState.LAYOUT_START : LayoutState.INVALID_LAYOUT); case FlexibleView.LayoutManager.Direction.Down: return(mOrientation == VERTICAL ? LayoutState.LAYOUT_END : LayoutState.INVALID_LAYOUT); case FlexibleView.LayoutManager.Direction.Left: return(mOrientation == HORIZONTAL ? LayoutState.LAYOUT_START : LayoutState.INVALID_LAYOUT); case FlexibleView.LayoutManager.Direction.Right: return(mOrientation == HORIZONTAL ? LayoutState.LAYOUT_END : LayoutState.INVALID_LAYOUT); default: return(LayoutState.INVALID_LAYOUT); } }
internal override FlexibleView.ViewHolder OnFocusSearchFailed(FlexibleView.ViewHolder focused, FlexibleView.LayoutManager.Direction direction, FlexibleView.Recycler recycler) { if (ChildCount == 0) { return(null); } int layoutDir = ConvertFocusDirectionToLayoutDirection(direction); if (layoutDir == LayoutState.INVALID_LAYOUT) { return(null); } int maxScroll = (int)(MAX_SCROLL_FACTOR * mOrientationHelper.GetTotalSpace()); UpdateLayoutState(layoutDir, maxScroll, false); mLayoutState.ScrollingOffset = LayoutState.SCROLLING_OFFSET_NaN; mLayoutState.Recycle = false; Fill(recycler, mLayoutState, true, true); FlexibleView.ViewHolder nextFocus; if (layoutDir == LayoutState.LAYOUT_START) { nextFocus = GetChildAt(0); } else { nextFocus = GetChildAt(ChildCount - 1); } return(nextFocus); }