Elemento agregado de enfoque en ExpandableListView

Esto parece simple, pero para la vida de mí no puedo entender esto.

Tengo un ExpandableListView con un ExpandableListAdapter personalizado descended de BaseExpandableListAdapter. Cuando agrego un nuevo elemento simplemente quiero enfocar el nuevo elemento. No puedo conseguir que funcione.

He intentado lo siguiente, que no funciona. Esto está en la actividad con el listview:

private void processNewItem(C360ItemOwner itemOwner, int pos){ Item item = itemOwner.newItem(pos); expAdapter.notifyDatasetChanged(); expandList.requestFocus(); if (item.getParentType() == Item.PARENT_IS_CHECKLIST) {//main level expandList.setSelectedGroup(pos); } else //Item.PARENT_IS_ITEM //sub level expandList.setSelectedChild(item.getParentAsItem().getPosition(), pos, true); } 

He intentado hacerlo en el adaptador en el método getView, que no funciona:

 public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { if (convertView == null) convertView = inf.inflate(R.layout.edit_group_item, null); Item group = (Item) getGroup(groupPosition); convertView.setTag(group); EditText edtParent = (EditText) convertView.findViewById(R.id.edtParent); edtParent.setTag(convertView); scatterItemText(edtParent); if (group.isNew()) { Toast.makeText(edtParent.getContext(), "Found Focus Item " + groupPosition, Toast.LENGTH_SHORT).show(); edtParent.requestFocus(); } return convertView; } 

He intentado configurar un par de campos en el adaptador: focusItem, un objeto de escritura sólo Item y focusEdit, sólo lectura EditText obect. Así que asignar el elemento y en getView, almacena la edición en un campo. Lo llamo así:

 private void processNewItem(C360ItemOwner itemOwner, int pos){ Item item = itemOwner.newItem(pos); expAdapter.setFocusItem(item);//<--Assign it here expAdapter.notifyDatasetChanged(); EditText edtFocus = expAdapter.getFocusEdit(); if (edtFocus != null) edtFocus.requestFocus(); } 

Entonces en getView del adaptador:

 public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { if (convertView == null) convertView = inf.inflate(R.layout.edit_group_item, null); Item group = (Item) getGroup(groupPosition); convertView.setTag(group); EditText edtParent = (EditText) convertView.findViewById(R.id.edtParent); edtParent.setTag(convertView); scatterItemText(edtParent); if (group == focusItem) { Toast.makeText(edtParent.getContext(), "Found Focus Item " + groupPosition, Toast.LENGTH_SHORT).show(); focusEdit = edtParent; } return convertView; } 

Estaba muy esperanzado para este último método, pero esta línea:

 EditText edtFocus = expAdapter.getFocusEdit(); 

Ocurre ANTES de ejecutar el método getView () que lo asignaría (por lo que siempre es nulo)! pl- halp

EDIT: Sé que esto sería descuidado, pero ¿qué pasa si hice corrió un hilo de rosca para esperar unos cientos de milisegundos para que getView () puede ejecutar y luego tratar de obtener focusEdit?

One Solution collect form web for “Elemento agregado de enfoque en ExpandableListView”

OK, lo averiguó con la ayuda de Foamy Guy. Mi corazonada de esperar un poco para comprobar si el focusEdit funcionó. Inicialmente he intentado con 1000 milisegundos para darle un montón de tiempo:

 private void setFocus() { EditText edtFocus = expAdapter.getFocusEdit(); if (edtFocus != null) edtFocus.requestFocus(); else Toast.makeText(getActivity(), "BLAH!", Toast.LENGTH_SHORT).show(); } final Runnable r = new Runnable() { public void run() { setFocus(); } }; private void processNewItem(C360ItemOwner itemOwner, int pos){ Item item = itemOwner.newItem(pos); if (itemOwner.getItemCount() == 1) checkHasItems(); expAdapter.setFocusItem(item); resetListAdapter(true); Handler handler = new Handler(); handler.postDelayed(r, 1000);//this works //handler.postDelayed(r, 10);//this works too //handler.postDelayed(r, 1);//this works too //handler.post(r);//this too! //r.run();//NOT this. This fails. } 

Entonces intenté 10 milisegundos y todavía trabajó. Entonces sólo un milisegundo y sorprendentemente que trabajó también. Foamy sugirió tratar de publicar sin el retraso y de hecho eso funciona. Finalmente traté de ejecutar el runnable directamente por solicitud de Foamy, pero que no.

Así que no estoy seguro, pero esto consigue el trabajo hecho. Grácias por la ayuda chicos.

  • La vista de lista de Android enruta contenido hasta un tamaño determinado basado en el tamaño de pie de página
  • ListView en el widget agrega aleatoriamente los elementos en el desplazamiento y el cambio de tamaño (vistas remotas anidadas)
  • CardView no muestra Shadow en Android L
  • ¿Cómo puedo eliminar el divisor de un listview en android?
  • Actualizar el valor del elemento ListView en Android
  • Guardar y volver a cargar ListView utilizando las preferencias compartidas
  • ListView sin ListActivity
  • Menú contextual de un ListFragment
  • Cambiar un divisor con setDivider en un ListActivity sin un ListView personalizado?
  • Lista de contactos con contacto La foto crea problemas de rendimiento
  • NullPointerException en android.widget.AbsListView.contentFits (AbsListView.java:722)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.