我可以使用 Simpleadapter 和 hashmap 用嵌套数组填充 listView 吗?

Posted

技术标签:

【中文标题】我可以使用 Simpleadapter 和 hashmap 用嵌套数组填充 listView 吗?【英文标题】:Can I populate a listView with a nested array using Simpleadapter and hashmap? 【发布时间】:2016-12-07 01:36:56 【问题描述】:

我正在尝试使用 HashMap 和 SimpleAdapter 从具有 12 列和 12 行的嵌套数组中填充 ListView

这是我的代码

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

然后是带有 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);

当我尝试这个时,我得到一个错误

android.widget.SimpleAdapter 中的SimpleAdapter(android.content.Context, java.util.List&lt;? extends java.util.Map&lt;java.lang.String,?&gt;&gt;, int, java.lang.String[], int[])' 不能应用于 (com.example.thevenom1215.prueba.MainActivity, java.util.List&lt;java.util.HashMap&lt;java.lang.String, java.lang.String&gt;&gt;, int, java.util.ArrayList&lt;java.lang.String&gt;, 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 by 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  ";

【问题讨论】:

首先,你为什么要这样做?使用带有 12 个字段的 Java 类。并将它们加载到ArrayAdapter 其次,您应该看到您提供的array2 参数必须是String[],而不是arraylist 或二维数组。 最后一个 new String from[252]: 不是正确的 java 语法。 new String[252]: 是。 我这样做是因为我需要 array2 中的每一个项目,而不是整个 Arraylist 如果我使用一个类来保存数据,例如具有 12 个字段的 data(),我不会只是能够保存一个字符串?我的意思是我一次只能保存一个字符串 我不确定你所说的一个字符串是什么意思。您定义一个自定义 xml 布局并将该对象“绑定”到您想要的任何视图。也许你应该包括你想要的截图或绘图。 【参考方案1】:

总的来说,我不会推荐这个。

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

适配器一次显示一个行项目,而不是整个表。


我建议使用CursorAdapter,因为您确实有Cursor 对象,但我将继续使用SimpleAdapter

首先,您需要创建一个 XML 布局,将其命名为 item_layout.xml。它包含您要将数据库中的行绑定到的所有视图。我相信这些都必须是 SimpleAdapter 的 TextViews。

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

然后,遍历游标的行,并将必要的信息提取到 HashMap 列表中。注意:每次循环游标结果时,这是一行的数据。而且,如前所述,您只有 TextView,因此您只能存储 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);

【讨论】:

我试过这个但给了我一个错误:请求索引 -1,大小为 21 想要更具描述性?如果您告诉我这会导致什么错误,我愿意编辑帖子。 @CesarJoelGurrola Right... cursor.getColumnIndexOrThrow 需要从数据库中获得正确的列名。您没有显示您的架构,因此您不能简单地按原样复制此答案。 我知道,我直接从查询中复制了列名,因为该错误是因为该列不存在对吗? String [] 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> fillMaps = new ArrayList>();

以上是关于我可以使用 Simpleadapter 和 hashmap 用嵌套数组填充 listView 吗?的主要内容,如果未能解决你的问题,请参考以下文章

GridView和SimpleAdapter九宫格作业

如何使用 SimpleAdapter 将下载的图像显示到 ImageView

使用 SimpleAdapter 访问 listView 的视图

AndroidStudio中ListView的使用方法之SimpleAdapter适配器

AndroidStudio中ListView的使用方法之SimpleAdapter适配器

AndroidStudio中ListView的使用方法之SimpleAdapter适配器