getChildCount() возвращает 0 в ListView

#android #listview #zero

#Android #listview #ноль

Вопрос:

Мне нужно проверить все элементы в ListView, чтобы установить метку только для одного из них. Я не могу редактировать базу данных или адаптер, я просто хочу прокрутить ListView, чтобы выполнить проверку и установить строку в TextView.

 @Override
protected void onResume(){
    super.onResume();
    ...
    cursor = getCursor();
    startManagingCursor(cursor);
    adapter = new SimpleCursorAdapter(this,R.layout.profile_item_layout,cursor,from,to);
    lst_profiles.setAdapter(adapter);
    SharedPreferences customSharedPreference = PreferenceManager.getDefaultSharedPreferences(ProfilerActivity.this.getApplicationContext());
    long current = customSharedPreference.getLong(ProfileManager.CURRENT, -1);
    toast(lst_profiles.getChildCount()); //display 0
    if(current!=-1){
        for(int i=0;i<lst_profiles.getChildCount();i  ){
            if(lst_profiles.getItemIdAtPosition(i)==current)
                ((TextView)lst_profiles.getChildAt(i).findViewById(R.id.activeLabel)).setText(getString(R.string.active));
            else
                ((TextView)lst_profiles.getChildAt(i).findViewById(R.id.activeLabel)).setText("");
        }       
    }
}
  

Как я могу сделать? Мне нужно чего-то ждать?

PS Очевидно, что ListView не является пустым.

Комментарии:

1. Как вы вызываете getCursor() здесь? Я не вижу для этого метода Activity или Context…

2. Да, я вызываю getCursor() внутри onResume(). Приложение работает нормально, единственная проблема — 0 в getChildCount()

Ответ №1:

Похоже, это неприятный взлом. Но ладно…

Дело в том, что в вашем списке не будет дочерних элементов, пока список не отображается пользователю. Но вы должны понимать, что getChildCount это вернет количество видимых элементов списка (возможно, около 10 просмотров), и их положение никогда не будет соотноситься с фактическим положением элемента в адаптере.

Если вам действительно нужно взаимодействовать с представлениями на таком низком уровне, вы можете попробовать подключить прослушиватель прокрутки к вашему списку:

 @Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
    for (int i = 0; i < visibleItemCount; i  ) {
        View child = getChildAt(i);
        // i   firstVisibleItem == the actual item position in the adapter
    }
}
  

Комментарии:

1. Хе-хе, здесь вы найдете всю необходимую информацию о том, как, почему и когда принимать ответы.