getChildCount () возвращает 0 в ListView - PullRequest
2 голосов
/ 08 октября 2011

Мне нужно проверить все элементы в 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("");
        }       
    }
}

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

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

1 Ответ

10 голосов
/ 09 октября 2011

Это похоже на неприятный хак.Но ладно ...

Дело в том, что в вашем списке не будет детей, если список не отображается для пользователя. Но вы должны понимать, что 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
    }
}
...