如何在listview的行和它的后代之间使用D-pad导航切换(Google-TV支持)

hen*_*918 9 android google-tv android-listview

我有一个listview,每个列表项中都有一个imageview,当用户点击该imageview时,它会弹出一个菜单.

它在带触摸屏的普通Android设备上运行良好.

但现在我想支持谷歌电视,哪个应用程序应该由D-pad控制.

当我使用D-pad在listview中导航时,只有整行可以聚焦,我无法将listview内的imageview作为焦点.

我尝试将android:focusable ="true"添加到imageview,但它导致整个listview无法接收onItemClick事件.

有没有人知道如何使用d-pad在listview行和listview中的项目之间移动焦点还可以保持listview和imageview可点击?

非常感谢!

小智 7

您必须为ListView设置以下内容:

listView.setItemsCanFocus(true);
Run Code Online (Sandbox Code Playgroud)

使用listItems中的可聚焦视图不会被忽略.


hen*_*918 4

我的列表视图与方向键一起使用,它可以在列表项内切换焦点。我就是这样解决的。首先,让您的列表视图具有项目焦点。

注意:如果您稍后在代码中尝试将 ItemsCanFocus 设置为 false,您会发现即使您再次设置回 true,列表项也无法再获得焦点,所以不要这样做。

mDpadListView.setItemsCanFocus(true);
Run Code Online (Sandbox Code Playgroud)

然后,您需要一个字段来跟踪当前选择的列表项。这里我将ViewHolder放在Adapter中listItem的标签中。

mDpadListView.setOnItemSelectedListener(new OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView<?> parent, View view,
            int position, long id) {
        if (view.getTag() != null) {
            DpadListAdapter.ViewHolder holder = (ViewHolder) view.getTag();
            if (holder.shortCut != null && holder.shortCut.isShown()) {
                currentSelectView = view;
            } else {
                currentSelectView = null;
            }
        } else {
            currentSelectView = null;
        }
    }

    @Override
    public void onNothingSelected(AdapterView<?> parent) {
    }
});
Run Code Online (Sandbox Code Playgroud)

第三,重写 Activity 方法中的 onKeyDown() 来控制 D-pad 的上、下、左、右键。

当用户按下方向键上的右键时,我让 listview 清除Foucs() 并让里面的 ImageView 获得焦点。

当用户按下向上、向下或向左键时,列表项中的 ImageView 将清除其焦点,并且 listView 再次获得焦点。

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    switch (keyCode) {
    case KeyEvent.KEYCODE_DPAD_RIGHT:
        if (currentSelectView != null) {
            DpadListAdapter.ViewHolder holder = 
                (ViewHolder)      currentSelectView.getTag();
            mDpadListView.clearFocus();
            holder.shortCut.setFocusable(true);
            holder.shortCut.requestFocus();
            return true;
        }
        break;
    case KeyEvent.KEYCODE_DPAD_LEFT:
    case KeyEvent.KEYCODE_DPAD_UP:
    case KeyEvent.KEYCODE_DPAD_DOWN:
        if (currentSelectView != null) {
            DpadListAdapter.ViewHolder holder = 
                    (ViewHolder) currentSelectView.getTag();
            if (holder.shortCut.hasFocus()) {
                holder.shortCut.clearFocus();
                holder.shortCut.setFocusable(false);
                mDpadView.requestFocus();
                return true;
            }
        }
        break;
    default:
        break;
    }
    return super.onKeyDown(keyCode, event);
}
Run Code Online (Sandbox Code Playgroud)