Android,ListView 显示来自 ArrayList 的相同数据?
Android, ListView showing identical data from ArrayList?
以下代码:
int i = 0;
for(Shift shift : mShifts){
shifts[i] = shift + "";
i++;
}
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getListView().getContext(), android.R.layout.simple_list_item_1, shifts);
setListAdapter(adapter);
生成所有唯一 Shift 对象的列表 - 看起来像...
com.name.appname.Shift@529a4ecc
com.name.appname.Shift@529a5010
com.name.appname.Shift@529a5088
com.name.appname.Shift@529a5100
... ect ...
我创建的 Shift 对象数量。其中 mShifts
是 Shift 个对象的 ArrayList。
但是,当我使用以下内容时:
int i = 0;
for(Shift shift : mShifts){
shifts[i] = String.format("%d", shift.getEnd());
i++;
}
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getListView().getContext(), android.R.layout.simple_list_item_1, shifts);
setListAdapter(adapter);
它会生成一个列表,其中包含所有相同的值,当它们被验证为唯一时。唯一的变化是循环内的字符串赋值。
相同的值都是最近 Shift 对象的时间戳。
shift.getEnd()
产生一个 long 值,它是事件发生时的时间戳(毫秒)。每个值都存储在数据库中,我已经验证(使用 SQLite 数据库浏览器)所有条目都是真正唯一的。
编辑 1
我通过以下方式从数据库分配 mShifts
:
ArrayList<Shift> mShifts = new ArrayList<Shift>();
if(cursor.moveToFirst()){
int i = 0;
do{
Shift shift = new Shift(getStringFromColumnName(cursor, ShiftsSQLiteHelper.COLUMN_SHIFT_NAME),
getStringFromColumnName(cursor, ShiftsSQLiteHelper.COLUMN_SHIFT_EMPLOYER),
getLongFromColumnName(cursor, ShiftsSQLiteHelper.COLUMN_SHIFT_START),
i);
mShifts.add(shift);
i++;
}while(cursor.moveToNext());
}
重要的是要注意,我已经使用上面的变量 i
对 end
的值进行了硬编码 - 这样我就可以确定这不是从数据库读取的错误.有 12 个对象,无论出于何种原因,数组列表中的打印输出显示所有对象都具有 end=11
(最后一个对象的值)。
问题不在于分配 ArrayList,而在于显示它。
编辑 2
在调试器中查看 mShifts
arrayList(同时分配列表)显示在每个循环中,数组列表中的所有值都设置为最新值。
所以有问题的代码是赋值循环。
移位class
public class Shift {
private static String mName;
private static String mEm;
private static long mStart;
private static long mEnd;
public Shift(String name, String em, long start, long end) {
setName(name);
setEm(em);
setStart(start);
setEnd(end);
}
public static String getName() {
return mName;
}
public static void setName(String name) {
mName = name;
}
public static String getEm() {
return mEm;
}
public static void setEm(String em) {
mEm = em;
}
public static long getStart() {
return mStart;
}
public static void setStart(long start) {
mStart = start;
}
public static long getEnd() {
return mEnd;
}
public static void setEnd(long end) {
mEnd = end;
}
}
如果您需要任何其他代码片段,请告诉我。
静态变量是 class 属性而不是对象属性,任何引用该变量的代码都引用完全相同的数据。
在您的情况下,您覆盖了 Shift 属性的先前内容。
以下代码:
int i = 0;
for(Shift shift : mShifts){
shifts[i] = shift + "";
i++;
}
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getListView().getContext(), android.R.layout.simple_list_item_1, shifts);
setListAdapter(adapter);
生成所有唯一 Shift 对象的列表 - 看起来像...
com.name.appname.Shift@529a4ecc
com.name.appname.Shift@529a5010
com.name.appname.Shift@529a5088
com.name.appname.Shift@529a5100
... ect ...
我创建的 Shift 对象数量。其中 mShifts
是 Shift 个对象的 ArrayList。
但是,当我使用以下内容时:
int i = 0;
for(Shift shift : mShifts){
shifts[i] = String.format("%d", shift.getEnd());
i++;
}
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getListView().getContext(), android.R.layout.simple_list_item_1, shifts);
setListAdapter(adapter);
它会生成一个列表,其中包含所有相同的值,当它们被验证为唯一时。唯一的变化是循环内的字符串赋值。
相同的值都是最近 Shift 对象的时间戳。
shift.getEnd()
产生一个 long 值,它是事件发生时的时间戳(毫秒)。每个值都存储在数据库中,我已经验证(使用 SQLite 数据库浏览器)所有条目都是真正唯一的。
编辑 1
我通过以下方式从数据库分配 mShifts
:
ArrayList<Shift> mShifts = new ArrayList<Shift>();
if(cursor.moveToFirst()){
int i = 0;
do{
Shift shift = new Shift(getStringFromColumnName(cursor, ShiftsSQLiteHelper.COLUMN_SHIFT_NAME),
getStringFromColumnName(cursor, ShiftsSQLiteHelper.COLUMN_SHIFT_EMPLOYER),
getLongFromColumnName(cursor, ShiftsSQLiteHelper.COLUMN_SHIFT_START),
i);
mShifts.add(shift);
i++;
}while(cursor.moveToNext());
}
重要的是要注意,我已经使用上面的变量 i
对 end
的值进行了硬编码 - 这样我就可以确定这不是从数据库读取的错误.有 12 个对象,无论出于何种原因,数组列表中的打印输出显示所有对象都具有 end=11
(最后一个对象的值)。
问题不在于分配 ArrayList,而在于显示它。
编辑 2
在调试器中查看 mShifts
arrayList(同时分配列表)显示在每个循环中,数组列表中的所有值都设置为最新值。
所以有问题的代码是赋值循环。
移位class
public class Shift {
private static String mName;
private static String mEm;
private static long mStart;
private static long mEnd;
public Shift(String name, String em, long start, long end) {
setName(name);
setEm(em);
setStart(start);
setEnd(end);
}
public static String getName() {
return mName;
}
public static void setName(String name) {
mName = name;
}
public static String getEm() {
return mEm;
}
public static void setEm(String em) {
mEm = em;
}
public static long getStart() {
return mStart;
}
public static void setStart(long start) {
mStart = start;
}
public static long getEnd() {
return mEnd;
}
public static void setEnd(long end) {
mEnd = end;
}
}
如果您需要任何其他代码片段,请告诉我。
静态变量是 class 属性而不是对象属性,任何引用该变量的代码都引用完全相同的数据。
在您的情况下,您覆盖了 Shift 属性的先前内容。