4

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

我曾经GridView显示图像。问题是当滚动到底部时,它不能再向上滚动了!我知道这种现象在触摸模式设备中永远不会发生,但对于 Android TV 来说,这确实很常见。

实际上,我在使用时遇到了同样的问题,我通过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);
    }
}

ListView如您所知,和之间有很大的区别GridView,即GridView具有多列项。因此,当关注第一行(不是适配器数据的第一行)时,关注的项目并不总是firstVisibleItem,并且上面的代码不再起作用。

编辑:不能向上滚动的原因是所有可见项目的安装高度完全等于其父项的ListView高度。GridView当 D-UP 键按下时,焦点移动到上面的小部件GridView而不是上面的项目。

我试过这个:

@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;
}

但不工作。有人可以给一些建议吗?

提前致谢!

4

1 回答 1

0

我有一个想法可能对你有用。如果不是滚动网格视图,您只需销毁它并在您想跳到可能有效的顶部时重新创建它。但是,对于您希望允许用户滚动它的情况,需要一种不同的方法。我建议您偏移网格视图,使其元素与父级不完全对齐。例如,如果底部可见行仅显示一半(中途截断),则它向用户表明还有更多项目要向下滚动。当您向上滚动时,同样适用 - 顶行将只显示一半(被剪切的项目的顶部)。这是我在电视应用程序中经常看到的一种模式。

于 2013-07-15T14:29:03.170 回答