android gridview focus

La navegación del teclado con Android GridView no desplaza la cuadrícula



focus (1)

Estoy tratando de usar un teclado para navegar a través de un GridView de elementos.

En la breve demostración, que solo contiene un GridView (que contiene vistas de elementos con android:focusable="true" ), puede ver que ninguno de los elementos se enfoca: la cuadrícula es lo que se desplaza (los elementos no se vuelven de color naranja ).

Agregar el android:descendantFocusability="afterDescendants" permite que cada elemento se enfoque primero, pero aún así, no continúa desplazando el GridView para que puedas navegar hacia abajo:

Al hacer clic en un elemento (con el mouse o al presionar Retorno si el elemento estaba enfocado, después de la corrección de enfocabilidad descendente), el elemento se vuelve azul, lo que indica que está en estado de presión.

@ layout / activity_my.xml:

<?xml version="1.0" encoding="utf-8"?> <GridView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/listview" android:layout_width="match_parent" android:layout_height="match_parent" android:numColumns="2" />

@ layout / dummy_item.xml:

<?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/dummy_item_parent" android:layout_width="match_parent" android:layout_height="150dp" android:gravity="center" android:focusable="true" android:clickable="true" android:background="@drawable/item_background" />

@ drawable / item_background.xml:

<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" android:drawable="@android:color/holo_blue_light" /> <item android:state_focused="true" android:drawable="@android:color/holo_orange_light" /> <item android:drawable="@android:color/holo_red_light" /> </selector>

MyActivity.java (con ListAdapter):

public class MyActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my); AbsListView listview = (AbsListView) findViewById(R.id.listview); listview.setAdapter(new DummyAdapter(getLayoutInflater())); } private static class DummyAdapter extends BaseAdapter { private static final int COUNT = 25; private final LayoutInflater layoutInflater; DummyAdapter(LayoutInflater layoutInflater) { this.layoutInflater = layoutInflater; } @Override public int getCount() { return COUNT; } @Override public String getItem(int position) { return "Item " + position; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { View view = convertView; if (view == null) { view = layoutInflater.inflate(R.layout.dummy_item, parent, false); } ((TextView) view).setText(getItem(position)); return view; } } }

El intercambio de GridView por un ListView, sin cambiar el adaptador, o los atributos de vista de elemento / vista de elemento, se comportará como se esperaba - los elementos pueden enfocarse y el ListView se desplazará a la parte inferior, de modo que todos los elementos se puedan enfocar solo con la entrada del teclado . Además, el uso de RecyclerView con LinearLayoutManager / GridLayoutManager también funcionará correctamente.

He intentado esto en API 16 y 22 con los mismos resultados. He intentado configurar el atributo android:descendantFocusability en el GridView a afterDescendents con el mismo resultado.


Intenté tu código y no funciona con GridView, como dijiste, pero también tengo algunos problemas con ListView . El ListView desplaza correctamente, pero solo se resalta el primer elemento de cada página.

Con estas pequeñas modificaciones, puede lograr el efecto que desea tanto en GridView como en ListView.

Elimine android:descendantFocusability en activity_my.xml:

<?xml version="1.0" encoding="utf-8"?> <GridView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/listview" android:layout_width="match_parent" android:layout_height="match_parent" android:numColumns="2" />

Eliminar android:focusable enfocable en dummy_item.xml:

<?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/dummy_item_parent" android:layout_width="match_parent" android:layout_height="150dp" android:gravity="center" android:clickable="true" android:background="@drawable/item_background" />

Cambio de android:state_focused a android:state_selected en item_background.xml:

<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" android:drawable="@android:color/holo_blue_light" /> <item android:state_selected="true" android:drawable="@android:color/holo_orange_light" /> <item android:drawable="@android:color/holo_red_light" /> </selector>