9
votes

Recherché: TableLayout-like Listview

Ma question pourrait être: "Comment créer une linearlayout horizontale mono-ligne avec deux textes non-emballages à une seule ligne non-emballage, où la View de gauche occupe toujours 1/3 de la largeur de l'écran disponible, la droite TextView occupe toujours 2 / 3 de la largeur de l'écran disponible et les étiquettes de texte tronquent avec ... quand ils sont trop longs pour afficher? " (Si cette question est suffisamment claire et que le lecteur - c'est-à-dire une solution qu'ils sont disposées à partager, une lecture plus poussée du problème et une description de la question peut être inutile.)

Un ListView peuplé avec quatre Linearlayouts apparaudrait alors quelque chose comme ceci: p> xxx pré>

dans cette maquette, dans la première rangée forte>, les étiquettes de texte gauche et droite étaient suffisamment courtes Pour afficher complètement, dans la deuxième rangée forte>, l'étiquette gauche était suffisamment courte pour s'afficher complètement, tandis que le texte de l'étiquette droite était trop long et était ainsi tronqué et le début du texte de la droite étiquette alignée verticalement avec le bon texte de la première rangée, créant visuellement une colonne comme si c'était dans une table-tables, dans la troisième rangée forte>, le texte de l'étiquette gauche était trop long et a été tronqué de manière tronquée aligner verticalement avec le texte gauche des deuxième et premières lignes, le texte de la bonne étiquette a commencé verticalement aligné verticalement avec la droite Texte des deuxième et premières lignes, et de la quatrième rangée forte>, le texte de l'étiquette de gauche était trop long et a ainsi été affiché de la même manière au texte gauche de la troisième rangée et le texte de la droite L'étiquette était trop longue et a donc été affichée de la même manière au texte approprié de la deuxième rangée. P>

de divers poteaux sur Stackoverflow et d'autres endroits, je suppose que lors de l'utilisation d'une barreau avec un arrayadapter est quelque peu possible, il y a quelque peu possible de Les inconvénients, et ce n'est probablement pas la bonne approche à prendre. P>

J'ai certainement essayé de nombreuses combinaisons de paramètres de mise en page, mais rien n'est encore très proche du but. J'essaie de trouver une solution qui fonctionnera sur de nombreuses tailles d'écran différentes, la spécification de largeurs de pixels spécifiques ne fonctionnerait probablement pas très bien. P>

Peut-être que l'exemple de code simple suivant (avec capture d'écran) est un exemple Bon point de départ pour la solution, et a juste besoin de petites modifications. P>

(Le formateur de code StackoverFlow a paniqué de ce code. Alors, veuillez pardonner toute formatage géniale.) P>

row.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:weightSum="3">
    <TextView
        android:id="@+id/left"
        android:layout_width="0dip"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:singleLine="true" />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="----" />
    <TextView
        android:id="@+id/right"
        android:layout_width="0dip"
        android:layout_height="wrap_content"
        android:layout_weight="2"
        android:singleLine="true" />
</LinearLayout>


0 commentaires

4 Réponses :


6
votes

Je pense que ce tutoriel vous aidera. Essayez Ceci ..

Votre rangée. XML devrait ressembler à: xxx

Vous avez besoin de ce type de mise en page juste? Corrigez-moi si je ne me trompe pas. Voir la sortie lorsque j'ai essayé le fichier de mise en page ci-dessus.


7 commentaires

Sauf si j'ai manqué quelque chose, en ce qui concerne une solution à mon problème, la différence significative entre cette solution proposée et l'exemple de code que j'ai affiché ci-dessus est que la solution proposée utilise des largeurs de vue texte explicites (même s'ils sont définis avec des trempettes), que je dit que je ne veux pas faire. Changer pour utiliser un Simpleadapter semble insignifiant. Ai-je manqué la différence clé?


Hey Utilisez ce lien: Twocol ListView .. Définissez ces deux attributs dans TextView de Two_Col_row.xml Fichier: Android: Layout_Width = "Wrap_Content" & Android: Singleline = "vrai"


Semblable à la première solution proposée, n'est pas la seule différence significative entre cette deuxième solution proposée et l'exemple de code que j'ai affiché ci-dessus que la solution proposée explicite les largeurs de vue du texte (même s'ils sont définis avec des trempées), que j'ai dit ne veulent pas à faire? Ai-je manqué la différence clé?


Si vous utilisez Android: Layout_weight = "Wrap_Content" et si son 1er TextView est plus grand, il affichera une chaîne totale en prenant toute la largeur de l'écran, puis de .... Mais ce n'est pas ce que vous vouliez réellement. Je pense donc que vous devez utiliser Android: Layout_Width = "NDIPS" en fonction de vos besoins. et définir leur facteur de layout_weight.


Je pense que vous devez définir la largeur de pixel. Voir le deuxième lien que j'ai posté dans les commentaires. Cela résoudra sûrement votre problème. Encore une fois j'ai posté le fichier Row.xml. Il vous suffit de modifier ce fichier uniquement dans votre code rien d'autre. Définir layout_weight = "1" (partie 1 / 3RD) dans le premier TextView et layout_weight = "2" (portion 2 / 3RD) dans le deuxième TextView.


Commentaire supprimé par erreur: C'est ce que je pense aussi à faire, ce que j'ai également essayé de faire, comme démontré dans le code d'origine que j'ai posté ci-dessus. Des idées de réglage ou de faire quelque chose d'autre pour obtenir la vue de type nappable, je suis après (bien sûr, sans définir les largeurs de pixels-explicites pour les vues de texte)?


Une telle planche de couleurs et laidémie et la façon dont les choses sont aménagées ne le rendent pas très à l'échelle, mais des félicitations pour l'idée. Fonctionne assez bien



3
votes

Vous pouvez utiliser nappayout et faire fonctionner comme listview (au moins visuellement). Voici ma réponse.


4 commentaires

Mais cela introduit-il une éventuelle fuite de mémoire (ou au moins une mauvaise gestion de la mémoire), pour la raison mentionnée dans Stackoverflow.com/Questtions/5039465/... ?


Il n'y a pas de fuite de mémoire ou de mauvaise gestion de la mémoire dans ce code. Le code crée simplement toutes les lignes de table et les insertions dans la table sur la scène de création de table. Oui, il ne peut pas être optimal de créer beaucoup de textview S au lieu de les recycler comme listview . Et cette variante peut consommer plus de mémoire, surtout si la table contient des centaines de lignes. Mais s'il y a 10-20 rangées seulement (comme dans mon cas), la différence n'est même pas perceptible.


Dans ma candidature, je disposerai de milliers de lignes, bien que probablement moins de 10 000. Si je ne peux pas comprendre autre chose, il vaut peut-être la peine de prendre le temps nécessaire au test de performance avec une solution comme celle-ci.


Réponse acceptée, car il aborde ce que j'ai demandé. Je n'ai cependant pas mis en œuvre cette approche dans ma demande. Au lieu de cela, je me le souris et le supporte avec des largeurs et des poids de mise en page.



3
votes

Hackbod présente une autre dispute de la raison pour laquelle ListViews ne peut pas mettre en page des lignes telles que la TableViews dans une réponse à la question Android a une table comme Adaptateur pour ListView .


0 commentaires

2
votes

Le meilleur que je puisse arriver, c'est avoir une rangée.xml qui ressemble à quelque chose comme ça. Ce n'est pas idéal, mais il conservera les lignes avec une largeur fixe, ce qui permettra d'évoluer sur un changement de dimensions, mais non basé sur le texte. Cela vous donnera 80% d'une disposition de table, avec les avantages d'une liste de liste.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content"
android:gravity="left|center"
android:layout_width="wrap_content"
android:paddingBottom="10px"
android:paddingTop="10px"
android:paddingLeft="3px">
 <TextView
    android:id="@+id/TextView01"
    android:layout_width="0dp"
    android:layout_weight=1
    android:layout_height="wrap_content"
    android:gravity="left"
    android:singleLine="true"
    android:textSize="15dip"
    android:textStyle="bold"
    android:textColor="#d08021"
    android:paddingLeft="20dip">
 </TextView>
 <TextView

    android:id="@+id/TextView02"
    android:layout_width="0dp"
    android:layout_weight=3
    android:layout_height="wrap_content"
    android:gravity="left"
    android:singleLine="true"
    android:layout_marginLeft="10dip"
    android:textSize="15dip"
    android:textStyle="bold"
    android:textColor="#7f0000">
 </TextView>

</LinearLayout>


0 commentaires