0

我正在尝试实现一个 GridView,它聚焦下一个项目和“列表末尾的过度滚动。

例如

1 2 3
4 5 6
7 8 9

我想滚动 1 > 2 > 3 > 4 > 5 > 6 > ...只需按右键。现在我只能滚动 1 > 2 > 3 然后它停止,我必须用向下键滚动。

我已经尝试在代码中设置 focusViews(在getView()我的 ArrayList 适配器的方法中,它填充了 GridView)

view.setId(position);
view.setNextFocusLeftId(position-1);
view.setNextFocusRightId(position+1);

但这不起作用。我在grepcodeboolean *Scroll(int direction)上找到了方法

但是这些是本地包,我无法覆盖它们。有关如何解决此问题的任何建议。我可以使用另一个视图并获得与 Gridview 相同的布局吗?

我还设置了一个OnFocusChangeListener看看没有反应会发生什么。

编辑: 我刚刚将它添加到我的MainActivity中,但现在它似乎onKeyDown只在 GridView 不处理 KeyEvent 时才被调用(如果选择了一行中的最后一个项目)。

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    switch (keyCode) {
    case KeyEvent.KEYCODE_DPAD_LEFT:
        if (focusedView > 0) {
            mContainer.setSelection(--focusedView);
            Log.v("TEST", focusedView+"");
        }
        return true;
    case KeyEvent.KEYCODE_DPAD_RIGHT:
        if (focusedView < mAdapter.getCount() - 1) {
            mContainer.setSelection(++focusedView);
            Log.v("TEST", focusedView+"");
        }
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

编辑2:这真是太愚蠢了,但工作得非常好:D

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    switch (keyCode) {
    case KeyEvent.KEYCODE_DPAD_LEFT:
        mContainer.onKeyDown(KeyEvent.KEYCODE_DPAD_UP, new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_UP));
        mContainer.onKeyDown(KeyEvent.KEYCODE_DPAD_RIGHT, new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_RIGHT));
        mContainer.onKeyDown(KeyEvent.KEYCODE_DPAD_RIGHT, new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_RIGHT));
        return true;
    case KeyEvent.KEYCODE_DPAD_RIGHT:
        mContainer.onKeyDown(KeyEvent.KEYCODE_DPAD_DOWN, new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_DOWN));
        mContainer.onKeyDown(KeyEvent.KEYCODE_DPAD_LEFT, new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_LEFT));
        mContainer.onKeyDown(KeyEvent.KEYCODE_DPAD_LEFT, new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_LEFT));
        return true;
    }

    return super.onKeyDown(keyCode, event);
}

我真的不想将此作为答案发布,我真的不想使用此代码,因为这是一个愚蠢的解决方法

; TLDR:仍然需要帮助

4

1 回答 1

0

好的,我用一段简单的代码管理了这个,这对我来说是一个足够好的解决方案。

我从 GridView 类派生并重写了方法:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    boolean keyHandled = false;
    if (this.getSelectedView() != null) {
        int focusedViewPosition = this.getSelectedItemPosition();
        switch (keyCode) {
        case KeyEvent.KEYCODE_DPAD_LEFT:
            if (focusedViewPosition > 0) {
                int prevItemPosition = focusedViewPosition - 1;
                this.setSelection(prevItemPosition);
                keyHandled = true;
            }
            break;
        case KeyEvent.KEYCODE_DPAD_RIGHT:
            if (focusedViewPosition < this.getChildCount() - 1) {
                int nextItemPosition = focusedViewPosition + 1;
                this.setSelection(nextItemPosition);
                keyHandled = true;
            }
            break;
        default:
            keyHandled = super.onKeyDown(keyCode, event);
        }
    } else {
        keyHandled = super.onKeyDown(keyCode, event);
    }
    return keyHandled;
}

这个解决方案的好处是它不需要任何视图的集合 ID 并且可以与所有 GridViews / Adapters 一起使用。

为什么我需要这么长时间只是因为在 Android 中的任何地方,Focus 都是名称Focusexept 在这里它被称为Selection. 这就是为什么我没有找到所需的方法。谁能告诉我他们为什么忘记了那个约定?:)

于 2013-11-05T15:50:05.640 回答