Intereting Posts
Синхронизация слайдов проекта Android Wear Завершение выполнения задания пользовательского интерфейса Использование «dontwarn» в proguard Открытие ссылки на браузер через уведомление не работает Зачем показывать ошибку IllegalStateException при настройке MediaRecorder? BroadcatReceiver объявлен в manifest.xml, не получая намерения LocalBroadcastManager Android N – приложение не поддерживает многооконный Фильтр Intent для обычных файловых исследователей Android: Как свернуть строку состояния на Android 4.2? Android AOSP – определение интервала сканирования и сканирования в исходном коде Android Как получить конкретные данные по стране в API Google Places для AutocompletePredictions в Android? Android: ScrollView не прокручивает клавиатуру Могу ли я отключить прокрутку в TextView при использовании LinkMovementMethod? Как узнать, какая SIM-карта делает исходящий вызов (Dual SIM) Пользовательский вид Android ActionBar не заполняет родительский

Объект Focus добавлен в ExpandableListView

Это кажется простым, но для жизни я не могу понять это.

У меня есть ExpandableListView с настраиваемым ExpandableListAdapter, исходящим из BaseExpandableListAdapter. Когда я добавляю новый элемент, я просто хочу сфокусировать новый элемент. Я не могу заставить это работать.

Я попробовал следующее, что не работает. Это относится к активности со списком:

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); } 

Я попытался сделать это в адаптере по методу getView, который не работает:

 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; } 

Я попытался настроить пару полей в адаптере: focusItem, объект Item только для записи и focusEdit, только для чтения EditText obect. Поэтому я назначаю элемент и в getView, он сохраняет редактирование в поле. Я называю это так:

 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(); } 

Затем в getView адаптера:

 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; } 

Я очень надеюсь на этот последний метод, но эта строка:

 EditText edtFocus = expAdapter.getFocusEdit(); 

Происходит до того, как запускается метод getView (), который назначил бы его (поэтому он всегда равен нулю)! 🙁 plz halp

EDIT: Я знаю, что это будет неаккуратно, но что, если бы я выполнил поток, чтобы подождать несколько сотен миллисекунд, чтобы getView () мог запускаться, а затем попытаться получить focusEdit?

Хорошо, понял это с помощью Foamy Guy. Моя догадка о том, чтобы немного подождать, чтобы проверить, что focusEdit выработал. Я изначально пробовал 1000 миллисекунд, чтобы дать ему много времени:

 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. } 

Затем я попробовал 10 миллисекунд и все еще работал. Тогда только одна миллисекунда и удивительно, что сработало тоже. Пена предложила попытаться просто опубликовать сообщение без задержки, и это действительно работает. Я, наконец, попытался запустить runnable непосредственно по запросу Foamy, но это не удалось.

Так что не уверен, но это выполняет свою работу. Спасибо за помощь, ребята!