web-dev-qa-db-fra.com

Comment afficher un ListView à deux colonnes dans Android?

J'ai une application Android qui affiche une vue en grille qui montre:

1

2

3

4

GridView gridview=(GridView)findViewById(R.id.GridView_test);
DataBaseHelper dbhelper=new DataBaseHelper(this);
ArrayList<String> test=new ArrayList<String>(5);
backlinksadapter.add("1");
backlinksadapter.add("2");
backlinksadapter.add("3");
backlinksadapter.add("4");
ArrayAdapter mAdapter=new ArrayAdapter<String>(this, Android.R.layout.simple_list_item_1, test);
gridview.setAdapter(mAdapter);

Au moment où ça marche, mais je voudrais montrer pour chaque ligne de la grille, 2 colonnes avec les valeurs d'un tableau à 2 dimensions (quelque chose comme GridView dans ASP.Net - en tant que source de données -) 

Je voudrais montrer:

1 | Personne 1

2 | Personne 2

3 | Personne 3

4 | Personne 4

Une idée?

16
Sosi

Est-ce que cela doit être une vue en grille? Est-ce qu'un ListView fonctionnera?

J'ai écrit un ListView et ListActivity qui affiche deux éléments dans chaque ligne. J'ai commencé avec le kit de développement fourni par SDK simple_list_item_2.xml qui répertorie deux éléments par ligne mais les place l'un sur l'autre (deux lignes) avec la deuxième ligne en utilisant une police plus petite. Ce que je voulais, c’était les deux éléments de la même ligne, un à droite et un à gauche.

D'abord, j'ai copié le fichier simple_list_item_2.xml dans le répertoire res/layout de mon projet sous un nouveau nom et modifié la propriété Android: mode = "twoLine" en "oneLine" tout en conservant le nom de l'élément de vue sous "TwoLineListItem". J'ai ensuite remplacé les deux éléments internes par des éléments qui faisaient ce que je voulais.

Dans le code d'initialisation de la liste, j'ai créé un MatrixCursor et l'ai renseigné avec les données souhaitées. Pour prendre en charge deux éléments, chaque ligne de MatrixCursor nécessite trois colonnes, l’une étant la clé primaire, "_id", et les deux autres colonnes, les éléments que je souhaitais afficher. J'ai ensuite pu utiliser un SimpleCursorAdapter pour remplir et contrôler le ListView.

Mon fichier XML de mise en page:

 <?xml version="1.0" encoding="utf-8"?>
  <TwoLineListItem
     xmlns:Android="http://schemas.Android.com/apk/res/Android"
     Android:paddingTop="2dip"
     Android:paddingBottom="2dip"
     Android:layout_width="fill_parent"
     Android:layout_height="wrap_content"
     Android:minHeight="?android:attr/listPreferredItemHeight"
     Android:mode="oneLine"
  >
<TextView
    Android:id="@Android:id/text1"
    Android:gravity="left"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_marginLeft="6dip"
    Android:layout_marginTop="6dip"
    Android:textAppearance="?android:attr/textAppearanceLarge"
/>
<TextView
    Android:id="@Android:id/text2"
    Android:gravity="right"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:layout_marginLeft="6dip"
    Android:layout_marginTop="6dip"
    Android:layout_marginRight="6dip"
    Android:layout_toRightOf="@Android:id/text1"
    Android:textAppearance="?android:attr/textAppearanceLarge"
    Android:textColor="@color/MainFontColor"
/>
</TwoLineListItem>

Notez que j'ai utilisé Android "à gauche" et "à droite": valeurs de gravité pour que l'élément de gauche soit justifié à gauche et que l'élément de droite soit à droite. Vous aurez besoin de différentes valeurs de gravité pour votre mise en page et vous aurez besoin de propriétés pour contrôler la taille de l'élément de gauche que je n'avais pas besoin.

La méthode de ma classe ListActivity qui a initialisé le ListView:

private void initListView()
{
    final String   AuthorName    = "Author: ";
    final String   CopyrightName = "CopyRight: ";
    final String   PriceName     = "Price: ";

    final String[] matrix  = { "_id", "name", "value" };
    final String[] columns = { "name", "value" };
    final int[]    layouts = { Android.R.id.text1, Android.R.id.text2 };

    MatrixCursor  cursor = new MatrixCursor(matrix);

    DecimalFormat formatter = new DecimalFormat("##,##0.00");

    cursor.addRow(new Object[] { key++, AuthorName, mAuthor });
    cursor.addRow(new Object[] { key++, CopyrightName, mCopyright });
    cursor.addRow(new Object[] { key++, PriceName,
            "$" + formatter.format(mPrice) });

    SimpleCursorAdapter data =
        new SimpleCursorAdapter(this,
                R.layout.viewlist_two_items,
                cursor,
                columns,
                layouts);

    setListAdapter( data );

}   // end of initListView()

Le paramètre du constructeur MatrixCursor est un tableau de chaînes qui définissent l'ordre et les noms des colonnes dans le curseur. Important: Assurez-vous d’ajouter une colonne "_id", sans elle, MatrixColumn lèvera une exception et ne fonctionnera pas!

Les trois variables, mAuthor, mCopyright et mPrice, sont trois données membres de ma classe ListAdaptor et sont initialisées ailleurs. Dans mon code actuel, mAuthor est en fait construit dans cette méthode à partir d'une liste de noms d'auteurs. Les noms d’auteurs sont concaténés dans une chaîne unique en utilisant "\ n" comme séparateurs entre les noms. Ainsi, plusieurs noms d’auteurs apparaissent sur différentes lignes du même TextView.

Les paramètres de SimpleCursorAdapter ctor sont l’ID de la vue à utiliser pour chaque ligne de la liste, le curseur contenant les données, un tableau de chaînes où chaque élément est le nom de la colonne du curseur (dans l’ordre dans lequel les obtenir) et un élément correspondant. tableau d'ID de vue que la vue doit utiliser pour chaque élément de la ligne de liste.

31
Steven F. Le Brun

Si vous ne trouvez pas un adaptateur existant qui possède ces propriétés, vous pouvez créer votre propre adaptateur personnalisé et le mapper à votre vue.

Le Bonjour, GridView tutoriel montre comment faire cela.

4
JRL

JRL a raison, vous devriez écrire votre propre adaptateur personnalisé qui vous permettra de contrôler ce qui sera affiché dans chaque ligne. Vous pourriez trouver ceci utile. Un exemple plus avancé peut être trouvé ici http://developerlife.com/tutorials/?p=327 .

Si vous ne voulez pas/devez utiliser une liste, TableLayout peut également afficher vos données. Mais ce serait l'approche manuelle puisqu'il faudrait remplir chaque cellule.

Le meilleur du succès.

3
stfn

Pourquoi ne pas créer une classe dont toString() renvoie str(id) + " | " + personName et l'utiliser comme classe de modèle au lieu de l'objet String?

0
Parallel Universe

Vous pouvez simplement ajouter ceci dans votre XML Android: numColumns = "2"

0