4

私は 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;
}

しかし、機能していません。誰かアドバイスをいただけますか?

前もって感謝します!

4

1 に答える 1

0

私はあなたのために働くかもしれない考えを持っています。グリッド ビューをスクロールする代わりに、グリッド ビューを破棄し、一番上にジャンプしたいときに再作成すると、うまくいく可能性があります。ユーザーがスクロールできるようにしたい場合は、別のアプローチが必要です。要素が親と完全に整列しないように、グリッド ビューをオフセットすることをお勧めします。たとえば、表示されている一番下の行が半分しか表示されていない (途中で切り取られている) 場合、下にスクロールするアイテムが他にもあることをユーザーに示します。上にスクロールしても同じことが当てはまります。一番上の行は半分しか表示されません (アイテムの上部がカットされます)。TVアプリでよく見かけるパターンです。

于 2013-07-15T14:29:03.170 に答える