Search code examples
androidlistviewmultidimensional-arrayhashmapsimpleadapter

Can I populate a listView with a nested array using Simpleadapter and hashmap?


I'm trying to populate a ListView using a HashMap and a SimpleAdapter from a nested array with 12 columns and 12 rows

So here is my code

try {
    String [][] array2 = new String[cursor.getCount()][cursor.getColumnCount()];
    cursor.moveToFirst();
    for (int i =0; i<cursor.getCount();i++){
        for(int j = 0; j < cursor.getColumnNames().length; j++) {
            String uname = cursor.getString(j);
            array2[i][j]=uname;
        }
        cursor.moveToNext();
    }
} finally {
    cursor.close();
}

and then the simple adapter with hashmap

int[] to = new int[]{R.id.item2, R.id.item3, R.id.item4, R.id.item5, R.id.item6, R.id.item7, R.id.item8 ,R.id.item9, R.id.item10, R.id.item11, R.id.item12};
List<HashMap<String,String>> fillMaps = (List<HashMap<String, String>>) new ArrayList<HashMap<String, String>>();

for(int i = 0; i<10;i++){
    HashMap<String,ArrayList> map = new HashMap<String, ArrayList>();

}

SimpleAdapter adapter = new SimpleAdapter(this, fillMaps, R.layout.grid_item, array2, to);

when I try this I get an error

SimpleAdapter(android.content.Context, java.util.List<? extends java.util.Map<java.lang.String,?>>, int, java.lang.String[], int[])' in android.widget.SimpleAdapter cannot be applied to (com.example.thevenom1215.prueba.MainActivity, java.util.List<java.util.HashMap<java.lang.String, java.lang.String>>, int, java.util.ArrayList<java.lang.String>, int[])

Or I thought that I could convert the nested array to a simple array is that possible? If so how can I accomplish that? I tried this

String from [] = new String from[252]:
from[0]= array[0][1]+"|"+array[0][2]+"|"+array[0][3]+......+array[0][12];

but it doesn't work.

In the array2, which is array2[12][21], every row has 12 columns, which are information of a person, for example (name, age)

Cesar Joel Gurrola, xx

The first row of the array is: [Cesar, Joel, Gurrola, xx]

I need that in an array because further in my code I need String by String and not a whole String "Cesar, Joel, Gurrola, xx"

Sql query

sql="select b.CVE_CONTR, r.NO_RECIBO , a.NOM_SOLICIT ,r.NO_PARCIAL ,r.SDO_TOTAL, r.STS_PAGO ,a.AP_PATSOLICIT,a.AP_MATSOLICIT, " +
                            "f.DESCRIPCION, b.NO_PARCIALID , b.PAGO_PARCIAL, b.TOT_APAG from MFRF_M_SOLICITANTES a, MFRF_M_CONTPREV_H b, MFRF_M_CONTPREV_D_RECGEN_2 r," +
                            "C_PAQUETE f , C_PARCIALIDADES g, MFRF_C_COLONIAS c where b.CVE_CONTR = '"+etnumcontrato.getText().toString() + "' and r.STS_PAGO in ('1','10','11','12')" +
                            "and c.ID_COLONIA = a.ID_COLONIA  and f.ID_PAQUETE = b.ID_PAQUETE and g.ID_PARCIALIDAD = b.ID_PARCIAL AND a.ID_SOLICIT = b.ID_SOLICITANTE  ";

Solution

  • Overall, I wouldn't recommend this.

    String [][] array2 = new String[cursor.getCount()][cursor.getColumnCount()];
    

    An adapter displays one row-item at a time, not the whole table.


    I would instead recommend a CursorAdapter since you do have a Cursor object, but I'll continue with a SimpleAdapter.

    First, you need to create an XML layout, let it be named item_layout.xml. It contains all the Views that you want to bind the row from the database to. I believe these must all be TextViews for a SimpleAdapter.

    String[] from = new String[] {"rowid", "fname", "mname", "lname"};
    int[] to = new int[] { R.id.item1, R.id.item2, R.id.item3, R.id.item4 };
    

    Then, loop over the rows of the cursor, and pull out the necessary information into a List of HashMaps. Note: this is one row of data each time that we are looping over the cursor results. And, as described earlier, you only have TextViews, so you can only store String values.

    List<HashMap<String, String>> fillMaps = new ArrayList<HashMap<String, String>>();
    final int rows = cursor.getCount();
    for (int i = 0; i < rows; i++) {
        HashMap<String, String> map = new HashMap<String, String>();
    
        map.put("rowid", "" + i);
        map.put("fname", cursor.getString(cursor.getColumnIndexOrThrow("fname"));
        map.put("mname", cursor.getString(cursor.getColumnIndexOrThrow("mname"));
        map.put("lname", cursor.getString(cursor.getColumnIndexOrThrow("lname"));
    
        fillMaps.add(map);
        cursor.moveToNext();
    }
    

    Now that you have looped over all the rows of the data and are satisfied with that data, you just set the adapter.

    SimpleAdapter adapter = new SimpleAdapter(this, fillMaps, 
            R.layout.item_layout, 
            from, to);
    listView.setAdapter(adapter);