android listview的项和子项工作不正常

android listview的项和子项工作不正常,android,android-listview,hashmap,android-ui,simpleadapter,Android,Android Listview,Hashmap,Android Ui,Simpleadapter,我有一个数据库,我选择了两个字符串,一个作为项目,另一个是描述。我正在尝试将这两个字符串映射到listview项目子项目布局中。以下代码是我迄今为止尝试的代码 List<Map<String, String>> data = new ArrayList<Map<String, String>>(); Map<String, String> datum = new HashMap<String, String>(2); Sim

我有一个数据库,我选择了两个字符串,一个作为项目,另一个是描述。我正在尝试将这两个字符串映射到listview项目子项目布局中。以下代码是我迄今为止尝试的代码

List<Map<String, String>> data = new ArrayList<Map<String, String>>();
Map<String, String> datum = new HashMap<String, String>(2);
SimpleAdapter adapter = new SimpleAdapter(this, data,
        android.R.layout.simple_list_item_2, 
        new String[] { "item","descr" }, 
        new int[] { android.R.id.text1, android.R.id.text2 });
itemList.setAdapter(adapter);

Cursor cours = MainActivity.mydb.query("sub_menu", null, "cat_id = "
        + menuid + " AND sub_flag = 1", null, null, null, null);

if (cours.moveToFirst()) {
    do {
        datum.put("item", cours.getString(cours.getColumnIndex("sub_label")));
        datum.put("descr", cours.getString(cours.getColumnIndex("sub_description")));
        data.add(datum);
        Log.d("testt", datum.toString());

        adapter.notifyDataSetChanged();

    } while (cours.moveToNext());
}
List data=new ArrayList();
地图基准=新的HashMap(2);
SimpleAdapter adapter=新SimpleAdapter(此,数据,
android.R.layout.simple\u list\u item\u 2,
新字符串[]{“item”,“descr”},
新的int[]{android.R.id.text1,android.R.id.text2});
itemList.setAdapter(适配器);
游标cours=MainActivity.mydb.query(“子菜单”,null,“目录id=”
+menuid+“和sub_标志=1”,null,null,null,null);
if(cours.moveToFirst()){
做{
datum.put(“项目”,cours.getString(cours.getColumnIndex(“子标签”));
datum.put(“descr”,cours.getString(cours.getColumnIndex(“sub_description”));
数据。添加(数据);
Log.d(“testt”,datum.toString());
adapter.notifyDataSetChanged();
}while(cours.moveToNext());
}
现在的问题是,它将向listview中添加5个具有相同值的条目,这些值是从数据库中选择的最后一行,而不是什么。你知道怎么解决这个问题吗

编辑。 在对其进行实验后,我发现我正在覆盖对象数据,最终所有条目都具有保存值。修复就像将基准的初始线移动到循环中一样简单。这是最后的代码

List<Map<String, String>> data = new ArrayList<Map<String, String>>();
        String[] from = new String[] { "rowid", "col_1" };
        int[] to = new int[] { android.R.id.text1, android.R.id.text2 };

        Cursor cours = MainActivity.mydb.query("sub_menu", null, "cat_id = "
                + menuid + " AND sub_flag = 1", null, null, null, null);

        if (cours.moveToFirst()) {

            do {
                Map<String, String> datum = new HashMap<String, String>(2);
                datum.put("rowid",
                        cours.getString(cours.getColumnIndex("sub_label")));
                datum.put("col_1", cours.getString(cours
                        .getColumnIndex("sub_description")));
                data.add(datum);
            } while (cours.moveToNext());

        }
        SimpleAdapter adapter = new SimpleAdapter(this, data,
                android.R.layout.simple_list_item_2, from, to);
        itemList.setAdapter(adapter);
List data=new ArrayList();
字符串[]from=新字符串[]{“rowid”,“col_1”};
int[]to=newint[]{android.R.id.text1,android.R.id.text2};
游标cours=MainActivity.mydb.query(“子菜单”,null,“目录id=”
+menuid+“和sub_标志=1”,null,null,null,null);
if(cours.moveToFirst()){
做{
地图基准=新的HashMap(2);
datum.put(“rowid”,
cours.getString(cours.getColumnIndex(“子标签”));
数据放置(“col_1”,cours.getString(cours
.getColumnIndex(“子描述”);
数据。添加(数据);
}while(cours.moveToNext());
}
SimpleAdapter adapter=新SimpleAdapter(此,数据,
android.R.layout.simple_list_item_2,from,to);
itemList.setAdapter(适配器);

定制
列表视图
并使用
游标适配器

这是一个很好的例子,会对你有所帮助

不要调用
adapter.notifyDataSetChanged()对于while循环中的每个迭代,在循环外调用它实际上我不理解您的问题,但是当我第一次看到
adapter.notifyDataSetChanged()时我刚刚发布了。在循环外调用它,如果条件为..我会尽力帮助你..如果你能澄清我在数据库中有一些项,例如x,x1,y,y1,其中x和y是我想在我的listview中显示为项1和项2的字符串,x1和y1是我想在我的listview中显示为子项1和子项2的字符串,你需要自定义listview,做那件事。。