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.

  • Crash al devolver el fragmento como una pestaña. Ver con la misma ID
  • Diferencia entre ScrollView y ListView
  • Espaciado entre los elementos de listView Android
  • Android -El contenido del adaptador ha cambiado pero ListView no recibió una notificación
  • La selección de ListView permanece persistente después de salir del modo de selección
  • Obtener datos de JSON en la vista de lista
  • ArrayAdapter de Android: agrega lista de cadenas en lugar de reemplazar
  • SetOnItemClickListener VS setOnItemSelectedListener en ListView.
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.