2013-04-05 2 views
3

Я пытаюсь получить представление из GridView. К сожалению, он возвращает null.GridView getChildAt() возвращает null

OnCreate():

GridView gridview = (GridView) findViewById(R.id.gridView); 
gridview.getChildAt(3).setBackgroundResource(R.drawable.list_selector_holo_light); 

gridview.getChildCount() возвращает 0 тоже!

Что я могу сделать для этого просмотра? Я знаю, что есть возможность изменить фон в адаптере, но я должен сделать это динамически.

Спасибо за помощь!


РЕДАКТИРОВАТЬ

setAdapter:

gridview.setAdapter(new ImageAdapter(this)); 

ImageAdapter:

public View getView(int position, View convertView, ViewGroup parent) { 
    final ImageView imageView; 
    if (convertView == null) { // if it's not recycled, initialize some attributes 
     imageView = new ImageView(mContext); 
     imageView.setLayoutParams(new GridView.LayoutParams(85, 85)); 
     imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
     imageView.setPadding(8, 8, 8, 8); 
    } else { 
     imageView = (ImageView) convertView; 
    } 

    imageView.setImageResource(mThumbIds[position]); 
    return imageView; 
} 
+0

Если gridview.getChildCount() возвращает 0, то компоненты не были правильно добавлены в GridView. Можете ли вы поделиться кодом о том, как вы добавляете компоненты. –

+0

Я добавил еще код. Спасибо. – Dennis

+0

Я не вижу проблем с опубликованным кодом, вы вызываете findViewById() в onCreate, это после вызова setContentView()? – adonal3

ответ

8

GridView будет заселен от адаптера во время первого прохода макета. Это значит, что у него не будет детей в onCreate(). Самый простой способ дождаться первого перехода макета - использовать ViewTreeObserver (см. View.getViewTreeObserver()) для регистрации глобального приемника макетов. При первом вызове слушателя сетка должна содержать детей.

Обратите внимание, что если вы хотите изменить фон одного из детей GridView, вам действительно нужно сделать это с адаптера. Поскольку виды возвращаются, фон может появиться, чтобы перейти к другому виду позже.

+0

Теперь он работает! Большое спасибо! Мне нужно изменить фон в активности вместо адаптера, потому что это зависит от того, что происходит в активности (что выбирает пользователь). Если у вас есть более эффективный способ, я сделал это, я хотел бы это услышать. Еще раз спасибо! – Dennis

+0

Есть ли способ «подделать» макет? Поскольку GridView ограничен как RemoteView, я хочу сохранить внутреннюю в моем RemoteViewService, которая генерирует красивый вид, а затем использует метод getDrawingCache и просто устанавливает образ в удаленном gridview. К сожалению gridView.getChildAt всегда возвращает значение null, потому что оно фактически не привязано к экрану. – schwiz