ListView 聚焦的问题

Issues with ListView focusing

在我的应用程序中,我有一个 Fragment,其中包含 GridViewListView,以使用 CursorAdapter 显示项目。仅启用这两种视图中的一种,用户可以选择他想要查看项目的方式。

所以,在我 FragmentonCreateView 方法中,我有

gv = (GridView) v.findViewById(R.id.itemselect_gridview);
lv = (ListView) v.findViewById(R.id.itemselect_listview);
if (!UserPreferences.isViewStyleGrid(getActivity())) {
    showList();
} else {
    showGrid();
}

showListshowGrid的代码是:

private void showList() {
    gv.setVisibility(View.GONE);
    lv.setVisibility(View.VISIBLE);
    UserPreferences.getPreferences(getActivity()).edit()
            .putString(Constants.VIEWSTYLE, "list").commit();
}

private void showGrid() {
    lv.setVisibility(View.GONE);
    gv.setVisibility(View.VISIBLE);
    UserPreferences.getPreferences(getActivity()).edit()
            .putString(Constants.VIEWSTYLE, "grid").commit();
}

当应用程序调用 showList 时,我无法使用方向键(游戏控制器)导航 ListView。按方向键无效,只有触摸输入有效。 如果应用程序改为调用 showGrid,则方向键可以正常工作。 如果我在运行时从网格切换到列表,方向键在 ListView 上也能正常工作,切换是使用前面提到的相同方法进行的。是什么导致了这个问题?我尝试使用 lv.setFocusable(true)lv.requestFocus() 没有结果。

我意识到调用 showGridshowList 还为时过早,所以我稍微更改了 onCreateView

    if (UserPreferences.isViewStyleGrid(mFragment.getActivity())) {
        gv.post(new Runnable() {
            @Override
            public void run() {
                showGrid();
            }
        });
    } else {
        lv.post(new Runnable() {
            @Override
            public void run() {
                showList();
            }
        });
    }

这样在视图完全初始化后调用这两个函数。