2010-03-15 4 views
0

J'ai donc une activité assez complexe, le parent étant une version linéaire avec une table avec quelques informations de base et des boutons. Ensuite, un couple listviews que l'utilisateur peut ajouter des éléments. Ainsi, ces listes croissent de plus en plus au fur et à mesure que l'utilisateur utilise l'application. Le problème que je rencontre est le Linearlayout est plus grand que la résolution de l'écran et il doit donc faire défiler. Donc, le défilement ne fonctionne pas sur les Listviews. J'ai essayé de jouer en changeant la layout_height de la listview et son élément enfant sans succès. Existe-t-il un moyen de faire en sorte que ces listes de lecture se développent en fonction du nombre d'enfants? Ou je vais à ce sujet tout faux? Si oui, quels autres contrôles puis-je utiliser?Comment faire pour que ListView atteigne la taille du contenu

Je suis ouvert à toutes les idées. Je ne sais vraiment pas comment s'y prendre.

Merci

Répondre

1

Le problème que je suis en cours d'exécution en est le LinearLayout est plus grande que la résolution de l'écran et donc il a besoin de faire défiler . Ainsi, le défilement ne fonctionne pas dans les listes.

Vous devez repenser la façon dont vous construisez votre interface utilisateur, comme vous ne pouvez pas avoir ListViews à l'intérieur d'un ScrollView.

Une possibilité est de tout mettre dans le ListView, marquant certaines lignes comme étant non-cliquables, donc ListView gère votre défilement. Vous pouvez utiliser mon MergeAdapter pour des cas comme celui-ci.

+0

J'ai donc une vue très complexe au dessus de mes listes. Tout est-il défini dans une vue xml, comment pourrais-je ajouter ces composants dans le MergeAdapter? Devrais-je créer tous mes contrôles lors de l'exécution? ou comment dois-je aller à ce sujet? – Jared

+0

Définir un fichier XML de mise en page avec les choses qui devraient aller dans le 'ListView' avant le contenu de votre adaptateur habituel. Gonflez cela à l'exécution en utilisant 'getLayoutInflater(). Gonflez()'. Ajoutez ce 'View' au' MergeAdapter', puis ajoutez votre habituel 'Adapter'. Puis placez le 'MergeAdapter' dans le' ListView'. Une fois que vous avez ce travail, étendez le 'MergeAdapter' pour remplacer les méthodes appropriées pour indiquer que votre première" ligne "n'est pas sélectionnable/cliquable. – CommonsWare

1

Si vous disposez d'une disposition simple, vous pouvez remplacer votre composant ListView par un LinearLayout et programmer manuellement la fonctionnalité dont vous avez besoin pour ajouter/supprimer et cliquer sur les éléments qu'il contient.

Voici un exemple simple. refreshStudentList() a pris la place de notifyDataSetChanged() être appelé sur l'adaptateur, recentConnections est un LinearLayout et adapter est une instance d'un Adapter (Vous pouvez utiliser l'adaptateur que vous utilisez pour votre ListView):

private void refreshStudentList() { 
    recentConnections.removeAllViews(); 

    for(int i=0; i < adapter.getCount(); i++) { 
     View toAdd = adapter.getView(i, null, recentConnections); 
     final int position = i; 
     toAdd.setOnClickListener(new OnClickListener() { 

      public void onClick(View v) { 
       // onItemClick functionality here 
      } 
     }); 

     recentConnections.addView(toAdd, new LayoutParams(LayoutParams.MATCH_PARENT, 
       (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 50, getResources().getDisplayMetrics()))); 
    } 

    recentConnections.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); 
} 

Comme vous pouvez le voir , au lieu d'un onItemClickListener J'ai défini un écouteur onClick à chaque élément de la liste. Cela pourrait facilement être changé pour être un écouteur onTouch si vous vouliez implémenter l'apparence d'un clic sur un élément de la liste (en changeant l'arrière-plan de la vue sur MotionEvent.ACTION_DOWN et MotionEvent.ACTION_UP).

L'autre chose que vous devez noter est que j'ai codé en dur une valeur dp pour la hauteur de chaque valeur (50dp dans ce cas). Lorsque vous créez et gonflez des vues par programme, elles n'ont pas de valeur "height", donc "wrap_content" devient 0.

également, notifyDataSetChanged() sur votre carte ne fera rien. Comme je l'ai dit, c'est une solution simple, mais c'est le début de la construction de votre propre composant personnalisé ExtendingListView si c'est ce que vous voulez.

Questions connexes