2010-10-05 28 views
1

Je crée un panneau de défilement avec de nombreuses vues enfants (par exemple, des boutons). Chaque vue enfant a un emplacement fixe en fonction de son index de ligne et de colonne. Je ne peux pas les créer au début car il y en a beaucoup et je manquerai de mémoire, donc je voudrais seulement ajouter une vue enfant quand elle croise le port d'affichage de l'écran (lorsque les utilisateurs font défiler vers cette zone). Je substituez la méthode OnLayout() avec quelque chose comme ceci:Ajouter des vues enfant lors du défilement (étendu) AdapterView

@Override 
protected void onLayout(boolean changed, int l, int t, int r, int b) { 
    super.onLayout(changed, l, t, r, b); 
    for (int row = 0; row < ROW_NUM; row++) { 
     ColumnAdapter columnAdapter = mRowAdapter.getItem(row); 
     for (int col = 0; col < COLUMN_NUM; col++) { 
      ItemView itemView = columnAdapter.getView(col, null, this); 
      if (isOnScreen(row, col)) { 
       itemView.layout(col * 100, row * 100, (col + 1) * 100, (row + 1) * 100); 
       addViewInLayout(itemView, row + col, null, true); 
      } 
     } 
    } 
    scrollTo(getScrollX(), getScrollY()); 
} 

(ColumnAdapter est une extension de l'adaptateur et ItemView est l'extension de bouton). Cela ne fonctionnerait pas car onLayout() n'est pas appelé pendant le défilement. Que dois-je faire pour ajouter ItemViews dynamiquement lorsque l'utilisateur défile?

Répondre

0

never mind je me suis dit que vous pouvez utiliser requestLayout() ...

0

Vous pouvez également envisager d'utiliser un ListView. Il fait exactement ce que vous voulez, c'est une charge paresseuse de ses éléments. Voir la session Google IO au ListView pour plus de détails.

En résumé, la classe Adapter que vous étendez a une fonction View getView(int position, View convertView, ViewGroup parent). Cette fonction peut être surchargée et faire un contrôle pour voir si convertView n'est pas null et le charger car il s'agit en fait d'une vue précédemment créée de cet élément enfant.

Il existe également des détails supplémentaires sur l'évitement de l'appel de la fonction findViewById(), car il est coûteux.

+0

Bonjour Noel, merci pour la réponse. J'aimerais utiliser ListView, sauf pour le widget que je crée contient de nombreuses colonnes qui peuvent défiler ensemble, tandis que ListView gère leur propre défilement individuellement. –