A solution
This is not a fundamental solution: write a new class, Inherit the ListView, and overwrite the onfocuschanged.
@Override protected void Onfocuschanged (Boolean gainfocus, int direction, Rect previouslyfocusedrect) { Super.onfocuschanged (Gainfocus, direction, previouslyfocusedrect); if (gainfocus && previouslyfocusedrect! = null) {Final ListAdapter adapter = Getadapter (); final int count = ADAP Ter.getcount (); switch (direction) {case focus_down:for (int i = 0; i < count; i++) {if (!adapter.isenabled (i)) {continue;} SetSel Ection (i); Break } break; Case focus_up:for (int i = count-1; i>=0; i--) {if (!adapter.isenabled (i)) {continue;} setselection (i); break;} BR Eak Default:break; } } }
Here, I only deal with Focus_down and focus_up. Due to the inability to access the mfirstposition, the processing has also been simplified: when the focus is removed from above, select the first one to select, and the last one to select when moving from below.
Questions about moving focus to the ListView in Android