Pregunta

Tengo una aplicación androide que muestra una vista de cuadrícula que muestra:

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);

Por el momento está funcionando, pero me gustaría mostrar línea foreach de la rejilla, 2 columnas con los valores de una matriz de 2 dimensiones (algo así como el GridView en ASP.Net - como fuente de datos -).

Me gustaría mostrar:

1 | Persona 1

2 | Persona 2

3 | Persona 3

4 | Persona 4

¿Alguna idea?

¿Fue útil?

Solución

¿Tiene que ser una vista de cuadrícula? Funcionará un ListView?

escribí un ListView y ListActivity que muestra dos artículos en cada fila. Empecé con la disposición simple_list_item_2.xml SDK suministrado que enumera dos elementos por fila, pero coloca una encima de la otra (dos líneas) con la segunda línea utilizando una fuente más pequeña. Lo que quería era ambas cosas en la misma línea, uno a la derecha y otro a la izquierda.

En primer lugar he copiado el simple_list_item_2.xml en el directorio res / layout de mi proyecto con un nuevo nombre y cambió el androide propiedad: mode = "dos líneas" a "Oneline" si bien mantienen la opinión de nombre del elemento como "TwoLineListItem". Volví a colocar los dos elementos internos con los que hice lo que quería.

En el código para inicializar la lista, he creado un MatrixCursor y lo llenó de los datos deseados. Para apoyar dos elementos, cada fila de la MatrixCursor requiere tres columnas, uno de ellos una clave principal, "_id", y las otras dos columnas que los artículos que quería mostrar. Yo era entonces capaz de utilizar un SimpleCursorAdapter para rellenar y controlar el ListView.

Mi diseño de archivo XML:

 <?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>

Tenga en cuenta que he usado androide "derecho" de "izquierda" y: los valores de gravedad para hacer que el elemento de lado izquierdo justificado a la izquierda y el elemento de lado derecho justificado a la derecha. Usted tendrá diferentes valores de gravedad para su diseño además de que tendrá propiedades para controlar el tamaño del elemento lateral izquierdo que no necesitaba.

El método en mi clase ListActivity que inicializa el 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()

El parámetro al constructor MatrixCursor es una matriz de cadenas que definen el orden y los nombres de las columnas en el cursor. Importante: Asegúrese de agregar una columna "_id", sin que el MatrixColumn arrojará una excepción y dejar de trabajar

Las tres variables, mAuthor, mCopyright y mPrice, son tres miembros de datos de mi clase ListAdaptor y se inicializan en otro lugar. En mi código real, mAuthor está construido en este método de una lista de nombres de autor. Los nombres de los autores se concatenan en una sola cadena usando "\ n" como separadores entre los nombres. Esto hace que los múltiples nombres de autor que aparezca en diferentes líneas en el mismo TextView.

Los parámetros SimpleCursorAdapter ctor son el ID de la vista a utilizar para cada fila de la lista, el cursor que contiene los datos, una matriz de cadenas, donde cada elemento es el nombre de la columna desde el cursor (en el orden de conseguirlos) y un conjunto correspondiente de identificadores de vista para la vista a utilizar para cada elemento de la fila de la lista.

Otros consejos

Si no puede encontrar un adaptador existente que tiene estas propiedades, puede crear su propio adaptador personalizado y tenerlo mapa a la vista.

El Hola, GridView tutorial muestra cómo hacerlo esto.

JRL es correcto, usted debe escribir su propio adaptador personalizado que le permitirá controlar lo que se mostrará en cada fila. Usted puede encontrar este útil. Un ejemplo más avanzado se puede encontrar aquí http://developerlife.com/tutorials/?p=327 .

Si usted no quiere / tiene que utilizar una lista de un TableLayout podría mostrar los datos también. Pero eso sería el enfoque manual, ya que tendría que llenar cada célula.

Lo mejor de éxito.

¿Por qué no crear una clase, cuya toString() devuelve str(id) + " | " + personName, y utilizarlo como una clase de plantilla en lugar del objeto String?

Usted puede simplemente añadir esto en el código XML    androide: númeroColumnas = "2"

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top