2015-07-12 162 views
0

在我的應用程序中,我有一個Fragment,其中包含GridViewListView以顯示使用CursorAdapter的項目。只有這兩個視圖中的一個被啓用,用戶可以選擇他想要查看項目的方式。ListView焦點問題

所以,在我的FragmentonCreateView方法我有

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

showList代碼和showGrid是:

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,我不能使用d墊(遊戲控制器)導航ListView。按下d-pad鍵無效,只有觸摸輸入有效。 如果應用程序調用showGrid,則該d-pad工作正常。 如果我在運行時從網格切換到列表,dpad也可以在ListView上正常工作,則交換機使用前面提到的相同方法生成。什麼可能導致這個問題?我試圖使用lv.setFocusable(true)lv.requestFocus()沒有結果。

回答

0

我意識到這是太早打電話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(); 
      } 
     }); 
    } 

這樣兩個函數被調用後的意見完全初始化。