Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/207.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Android游标转换为数组的ArrayList_Android_Arraylist_Cursor - Fatal编程技术网

将Android游标转换为数组的ArrayList

将Android游标转换为数组的ArrayList,android,arraylist,cursor,Android,Arraylist,Cursor,我尝试将光标数据转换为arraylist。但最后,arraylist中的所有数据都会被最后一行覆盖。我做错了什么 Cursor c = myDbHelper.getLvl1Cata(); String[] data = new String[3]; c.moveToFirst(); while(!c.isAfterLast()) { data[0] = Integer.toString(c.getInt(0));

我尝试将光标数据转换为arraylist。但最后,arraylist中的所有数据都会被最后一行覆盖。我做错了什么

Cursor c = myDbHelper.getLvl1Cata();
        String[] data = new String[3];
        c.moveToFirst();
        while(!c.isAfterLast()) {
                data[0] = Integer.toString(c.getInt(0));
                data[1] = c.getString(1);
                data[2] = Integer.toString(c.getInt(2));
                Log.e("cc", data[1]);
                catalogueData.add(data);
                c.moveToNext();
        }   

Put
String[]data=新字符串[3]编码到while循环中。每次迭代都会覆盖数组对象。

试试这个

Cursor c = myDbHelper.getLvl1Cata();
String[] data;
if (c != null) {
    while(c.moveToNext()) {
        data = new String[3]; // Note this addition
        data[0] = Integer.toString(c.getInt(0));
        data[1] = c.getString(1);
        data[2] = Integer.toString(c.getInt(2));
        Log.e("cc", data[1]);
        catalogueData.add(data);
    }
    c.close();
}
data
是字符串数组。在原始代码中,您多次将同一数组添加到
catalogeData
结构中。您每次都更改了数组内容的值,但它仍然是同一个数组对象。因此,
编目数据
保存了对单个数组的多个引用,而该数组只能有一个
数据[0]
的值:您最后设置的值

此答案通过为光标中的每一行使用新的和不同的数组来修复此问题。

尝试以下方法:

if(mycursor!=null){    
            do{
    TextView name = (TextView)view.findViewById(R.id.contact_name);               
    name.setText(cursor.getString(cursor.getColumnIndex
                (Displayname)));
    mycursor.moveToNext();
            }while (mycursor.isLast());
        }

在android中,在循环中创建新对象是一种糟糕的做法!请看我的答案,声明和初始化分两步完成。@WarrenFaith:你能澄清一下在循环中创建新对象的意思吗?您的答案还将在循环中创建一个新对象,尽管您将变量的声明与对象的创建分开。@LarsH:他的答案的执行方式与我的完全相同。声明放在哪里并不重要。如果要保存数组集合,则必须在每次迭代时创建一组新数组,否则上一组数组将覆盖上一组数组。否则,如果在每次迭代时仅丢弃数组,则是这样。您可能希望在循环之外创建对象。嘿,Waren,我也在做同样的事情,我在CatalogEdata.add(data);,那到底是什么?请您引导我完成此操作。@Anupam您需要告诉我错误是什么,否则我将无能为力。@WarrenFaith是否有任何方法可以一次性读取光标并存储在数组列表中。如果我不想运行循环?@ShivamAgrawal否。光标只是指向数据的指针,您需要自己移动它。所以循环是唯一的机会。@Anupam catalozedata.add(数据);正在向arraylist目录数据添加数据。CatalozeData变量应该是List或ArrayList或类似的东西。