私は Android スマート TV でアプリを開発しています。これは、リモート コントローラーを使用してフォーカス位置を移動することしかできません (通常の 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;
}
しかし、機能していません。誰かアドバイスをいただけますか?
前もって感謝します!