Могу ли я заполнить listView вложенным массивом, используя Simpleadapter и hashmap?

Я пытаюсь заполнить ListView с помощью HashMap и SimpleAdapter из вложенного массива с 12 столбцами и 12 строками.

Итак, вот мой код

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

а затем простой адаптер с хэш-картой

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

когда я пытаюсь это сделать, я получаю сообщение об ошибке

SimpleAdapter(android.content.Context, java.util.List<? extends java.util.Map<java.lang.String,?>>, int, java.lang.String[], int[])' в android.widget.SimpleAdapter нельзя применить к (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[])

Или я думал, что смогу преобразовать вложенный массив в простой массив, это возможно? Если да, то как я могу это сделать? я пробовал это

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

но это не работает.

В array2, то есть array2[12][21], каждая строка имеет 12 столбцов, которые содержат информацию о человеке, например (name, age).

Cesar Joel Gurrola, xx

Первая строка массива: [Cesar, Joel, Gurrola, xx]

Мне нужно это в массиве, потому что дальше в моем коде мне нужно String по String, а не целая строка "Cesar, Joel, Gurrola, xx"

SQL-запрос

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

person Cesar Joel Gurrola    schedule 01.08.2016    source источник
comment
Во-первых, зачем ты это делаешь? Используйте класс Java с вашими 12 полями. И загрузите их в ArrayAdapter   -  person OneCricketeer    schedule 02.08.2016
comment
Во-вторых, вы должны увидеть, что указанный вами параметр array2 должен быть String[], а не массивом массивов или 2D-массивом.   -  person OneCricketeer    schedule 02.08.2016
comment
И последний new String from[252]: не является правильным синтаксисом Java. new String[252]: есть.   -  person OneCricketeer    schedule 02.08.2016
comment
Я делаю это, потому что мне нужен каждый отдельный элемент в массиве2, а не весь список массивов. Если я использую класс для сохранения данных, например data() с 12 полями, разве я не смогу сохранить только одну строку? Я имею в виду, что я могу сохранить только одну строку за раз   -  person Cesar Joel Gurrola    schedule 02.08.2016
comment
Я не уверен, что вы подразумеваете под одной строкой. Вы определяете собственный макет xml и привязываете этот объект к любому представлению, которое хотите. Возможно, вам следует включить скриншот или рисунок того, что вы хотите.   -  person OneCricketeer    schedule 02.08.2016
comment
В массиве2 есть информация: массив2[12][21], каждая строка имеет 12 столбцов, которые являются информацией о человеке, например, мое имя Сезар Джоэл Гуррола, затем мой возраст xx лет, поэтому строка 0 массива : array2[0][0] Cesar array2[0][1] Joel array2[0][3] Gurrola array2[0][4] xx Мне это нужно, потому что дальше в моем коде мне нужна строка за строкой, а не целиком Строка Сезар, Джоэл, Гуррола, хх   -  person Cesar Joel Gurrola    schedule 02.08.2016
comment
Это хранится в Sqlite? По сути, вы описываете таблицу базы данных. И вам нужно расширить каждое вложенное значение или преобразовать в отдельный объект, например String   -  person OneCricketeer    schedule 02.08.2016
comment
да, да, мне нужно, но я не знаю, как   -  person Cesar Joel Gurrola    schedule 02.08.2016
comment
Спасибо за редактирование. Теперь, не могли бы вы очистить код в комментариях к моему ответу и описать, что работает и не работает на этот раз, но в вопросе, а не в комментариях?   -  person OneCricketeer    schedule 03.08.2016


Ответы (1)


В целом, я бы не рекомендовал это.

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

Адаптер отображает одну строку за раз, а не всю таблицу.


Вместо этого я бы рекомендовал CursorAdapter, поскольку у вас есть объект Cursor, но я продолжу с SimpleAdapter.

Во-первых, вам нужно создать макет XML, пусть он будет называться item_layout.xml. Он содержит все представления, к которым вы хотите привязать строку из базы данных. Я считаю, что все они должны быть TextViews для 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 };

Затем прокрутите строки курсора и вытащите необходимую информацию в список хэш-карт. Примечание. Это одна строка данных каждый раз, когда мы перебираем результаты курсора. И, как описано ранее, у вас есть только TextViews, поэтому вы можете хранить только значения String.

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

Теперь, когда вы перебрали все строки данных и удовлетворены этими данными, вы просто устанавливаете адаптер.

SimpleAdapter adapter = new SimpleAdapter(this, fillMaps, 
        R.layout.item_layout, 
        from, to);
listView.setAdapter(adapter);
person OneCricketeer    schedule 02.08.2016
comment
Я пробовал это, но выдает ошибку: запрошен индекс -1 с размером 21. - person Cesar Joel Gurrola; 02.08.2016
comment
Хотите быть более описательным, чем это? Я готов отредактировать сообщение, если вы скажете мне, какую ошибку это вызывает. - person OneCricketeer; 02.08.2016
comment
@CesarJoelGurrola Верно... cursor.getColumnIndexOrThrow нужно указать правильное имя столбца из базы данных. Вы не показали свою схему, поэтому вы не можете просто скопировать этот ответ как есть. - person OneCricketeer; 02.08.2016
comment
Я знаю, и я скопировал имя столбца прямо из запроса, потому что эта ошибка связана с тем, что столбец не существует, верно? - person Cesar Joel Gurrola; 02.08.2016
comment
Строка [] from = new String[]{CVE_CONTR,NO_RECIBO,NOM_SOLICIT,NO_PARCIAL,SDO_TOTAL,STS_PAGO,AP_PATSOLICIT,AP_MATSOLICIT,DESCRIPCION, NO_PARCIALID,PAGO_PARCIAL,TOT_APAG}; int[] to = new int[]{R.id.c1, R.id.c2, R.id.c3, R.id.c4, R.id.c5, R.id.c6, R.id. c7, R.id.c8, R.id.c9, R.id.c10, R.id.c11, R.id.c12, R.id.c13, R.id.c14}; List‹HashMap‹String, String›› fillMaps = new ArrayList‹HashMap‹String, String››(); - person Cesar Joel Gurrola; 02.08.2016
comment
окончательные целые строки = cursor.getCount(); HashMap‹String, String› map = new HashMap‹String, String›(); fillMaps.add(карта); for (int i = 0; i ‹ rows; i++){ map.put(rowid, +i); - person Cesar Joel Gurrola; 02.08.2016
comment
map.put(CVE_CONTR, cursor.getString(cursor.getColumnIndex(CVE_CONTR))); map.put(NO_RECIBO,cursor.getString(cursor.getColumnIndexOrThrow(NO_RECIBO))); map.put(NOM_SOLICIT,cursor.getString(cursor.getColumnIndexOrThrow(NOM_SOLICIT))); map.put(NO_PARCIAL,cursor.getString(cursor.getColumnIndexOrThrow(NO_PARCIAL))); - person Cesar Joel Gurrola; 02.08.2016
comment
На этом я вас остановлю. Пожалуйста, не используйте комментарии для кода. - person OneCricketeer; 02.08.2016
comment
и так...... map.put(TOT_APAG,cursor.getString(cursor.getColumnIndexOrThrow(TOT_APAG))); fillMaps.add(карта); курсор.moveToNext(); } но я получил эту ошибку, когда использовал приведенный выше код (тот, что в вопросе). Я решаю эту ошибку, добавляя элемент в массив, чтобы массив не был пустым, и я пробовал это здесь, но не Работа - person Cesar Joel Gurrola; 02.08.2016
comment
Скорее всего, вы получите сообщение об ошибке из-за использования getString, когда пытаетесь получить доступ к столбцу, который не является строковым типом в базе данных. Вам нужно использовать getInt, например, для числовых столбцов - person OneCricketeer; 02.08.2016
comment
поэтому я должен изменить HashMap, потому что, если я изменю getString на getInt, я помечаю его как синтаксическую ошибку - person Cesar Joel Gurrola; 02.08.2016
comment
@CesarJoelGurrola HashMap должен содержать строки. Это нельзя изменить. Однако вы можете использовать String.valueOf() для целочисленного значения, чтобы получить строку. - person OneCricketeer; 02.08.2016
comment
когда я отлаживаю это, он возвращает мне null map.put(CVE_CONTR, cursor.getString(cursor.getColumnIndex(CVE_CONTR))); имя столбца в базе данных CVE_CONTR такое же, так почему оно возвращает мне ноль? любая идея? также я попробовал cvecontr=cursor.getString0, и снова он равен нулю, так что может быть причиной? - person Cesar Joel Gurrola; 02.08.2016
comment
Вы могли бы просто иметь нулевое значение в базе данных :) - person OneCricketeer; 02.08.2016
comment
но почему, когда я пробую этот ArrayList‹String› datos = new ArrayList‹String›(); интервал я = 0; while (cursor.moveToNext()) { datos.add(i, cursor.getString(0) +, + cursor.getString(1) +, + cursor.getString(2) +, + cursor.getString(3) +, + курсор.getString(4)+ ,+ курсор.getString(5)+ ,+ курсор.getString(6)+ ,+ курсор.getString(7)+ ,+ курсор.getString(8)+ ,+ курсор.getString( 9)+ ,+ cursor.getString(10)+ ,+ cursor.getString(11)); я++; } он возвращает мне список значений, и ни один из них не является пустым - person Cesar Joel Gurrola; 02.08.2016