我正在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;
}
但不工作。有人可以给一些建议吗?
提前致谢!