У меня есть:
ArrayList<SubwordInfo> subwordInfoList
- мои данные - список SubwordInfo
объектов.
ListView lvSubwords
- ListView для отображения моих данных
SubwordListAdapter subwordListAdapter
- мой собственный адаптер между subwordInfoList
и lvSubwords
(на базе BaseAdapter).
В какой-то момент я хочу сделать простую вещь:
- Обновить элемент данных в
subwordInfoList
. - Обновите внешний вид соответствующего дочернего представления в
lvSubwords
. - Позиционируйте
lvSubwords
на этом дочернем виде. - Запустите анимацию в этом дочернем представлении.
Шаги 1-3 работают нормально. Но шаг 4 - проблема, потому что я не могу правильно получить доступ к дочернему представлению. Я получаю неправильное дочернее представление или ноль.
Там код:
SubwordInfo si;
...
si=subwordInfoList.get(subwordNo);
<updating si>
subwordListAdapter.notifyDataSetChanged(); //Notify for update - successfull
lvSubwords.setSelection(subwordNo); //Positionize - successfull
И после этого я пытаюсь получить доступ к дочернему представлению, соответствующему si
.
Я пытался сделать это:
View view = lvSubwords.getChildAt(subwordNo-lvSubwords.getFirstVisiblePosition());
if (view!=null)
view.startAnimation(animHighlight);
Иногда это работает, иногда нет (view==NULL). Иногда взгляд — это неправильный взгляд.
Также я попытался использовать теги просмотра:
View view = lvSubwords.findViewWithTag(si);
if (view!=null)
view.startAnimation(animHighlight);
Теги назначаются перед в getView адаптера:
@Override
public View getView(int arg0, View arg1, ViewGroup arg2)
{
View view = arg1;
if (view == null)
view = lInflater.inflate(R.layout.subword_element, arg2, false);
SubwordInfo si = getSubwordInfo(arg0);
...
view.setTag(si);//Assigning tags
return view;
}
Это работает, только если lvSubwords.getFirstVisiblePosition()
было равно 0 ДО вызова subwordListAdapter.notifyDataSetChanged()
и lvSubwords.setSelection
. В противном случае представление равно нулю.
Кроме того, я обнаружил, что lvSubwords.getFirstVisiblePosition()
возвращает одно и то же значение до и после вызова lvSubwords.setSelection
.
Итак, мне кажется, что после вызова subwordListAdapter.notifyDataSetChanged()
и lvSubwords.setSelection
дочерних представлений ListView и сам ListView не обновляется сразу. И они обновятся через некоторое время. Как я могу поймать этот момент и получить желаемое дочернее представление для анимации?