如何在Android TV中使用键盘将GridView滚动到顶部

如何在Android TV中使用键盘将GridView滚动到顶部,android,gridview,focus,google-tv,Android,Gridview,Focus,Google Tv,我正在Android智能电视上开发应用程序,它只能使用遥控器导航焦点位置(就像在普通Android设备中使用d-pad键一样) 我使用GridView来显示图像。问题是当滚动到底部时,它不能再向上滚动了!我知道这种现象永远不会发生在触摸模式的设备上,但对于安卓电视来说,这是非常普遍的 实际上,我在使用ListView时遇到了同样的问题,我通过手动滚动到最上面一行来解决。覆盖AbsListView.OnScrollListener: @Override public void onScroll(A

我正在Android智能电视上开发应用程序,它只能使用遥控器导航焦点位置(就像在普通Android设备中使用d-pad键一样)

我使用
GridView
来显示图像。问题是当滚动到底部时,它不能再向上滚动了!我知道这种现象永远不会发生在触摸模式的设备上,但对于安卓电视来说,这是非常普遍的

实际上,我在使用
ListView
时遇到了同样的问题,我通过手动滚动到最上面一行来解决。覆盖AbsListView.OnScrollListener:

@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
        int totalItemCount) {
    try {
        if (firstVisibleItem > 0 
                && view.getChildAt(0).isSelected()
                || view.getChildAt(0).hasFocus()) {
            view.smoothScrollToPosition(firstVisibleItem - 1);
            Log.d(TAG, "scroll up");
        } else if ((firstVisibleItem + visibleItemCount) < totalItemCount
                && view.getChildAt(visibleItemCount-1).hasFocus()
                || view.getChildAt(visibleItemCount-1).isSelected()) {
            view.smoothScrollToPosition(firstVisibleItem + visibleItemCount + 1);
            Log.d(TAG, "scroll down");
        }
    } catch (Exception e) {
        //Log.e(TAG, e.getMessage(),e);
    }
}
但不起作用。有人能给点建议吗


提前谢谢

我有个主意可能对你有用。如果不滚动网格视图,您只需销毁它,并在想要跳到顶部时重新创建它,这可能会起作用。然而,如果您希望允许用户滚动,则需要另一种方法。我建议偏移栅格视图,使其图元与父视图不完全对齐。例如,如果底部的可见行仅显示一半(中途截断),则向用户指示还有更多项目要向下滚动。当你向上滚动时,同样的情况也会发生——最上面的一行只显示了一半(被剪切的项目的顶部)。这是我在电视应用程序中经常看到的一种模式。

iStar您解决了这个问题吗?我不确定我的问题是否与你的类似-
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
        int visibleItemCount, int totalItemCount) {
    if (firstVisibleItem > 0 && isFocusOnFirstRow()) {
        view.smoothScrollToPosition(firstVisibleItem - 1);
        Log.d(TAG, "scroll up");
    }
}

private boolean isFocusOnFirstRow() {
    try {
        for (int i = 0; i < mGridView.getNumColumns(); i++) {
            if (mGridView.getChildAt(i).hasFocus()) {
                return true;
            }
        }
    } catch (Exception e) {
        // ArrayIndexOutofBoundsException
        Log.e(TAG, e.getMessage());
    } 
    return false;
}