Android测速仪APP:多列ListView显示0而非数据库超速数据
解决ListView显示0而非数据库实际值的问题
嘿,我仔细看了你的代码,马上就揪出了几个导致ListView只显示0的关键问题,咱们一个个来修复:
1. Entry类构造函数赋值完全搞反了
这是最核心的问题!你的Entry构造函数里,把参数赋值给类成员的逻辑写反了,导致所有属性都保留了默认的0值:
错误代码:
public Entry(float speed, double longitude, double latitude, long time){ speed = Speed; longitude = Longitude; latitude = Latitude; time = Time; }
修正后(用this区分类成员和参数,把参数值赋给类成员):
public Entry(float speed, double longitude, double latitude, long time){ this.Speed = speed; this.Longitude = longitude; this.Latitude = latitude; this.Time = time; }
2. MainActivity中传参错误
在onLocationChanged方法里调用speedLimit时,你传的是类成员longi(初始值为0),而不是当前Location获取到的longitude:
错误代码:
speedLimit(curSpeed, longi, latitude, timestamp);
改成:
speedLimit(curSpeed, longitude, latitude, timestamp);
同时,speedLimit里调用AddData时也要同步修正传参:
public void speedLimit(float curSpeed, double longitude, double latitude, long timestamp) { if (curSpeed > savedSpeed) { Toast.makeText(this, "Ayo you goin too fast", Toast.LENGTH_SHORT).show(); AddData(curSpeed, longitude, latitude, timestamp); // 这里修正为正确的longitude参数 } }
3. DatabaseHelper的onUpgrade方法SQL语句错误
你的onUpgrade里删除表的语句用了字符串"TABLE_NAME",而不是变量TABLE_NAME,导致升级数据库时无法正确删除旧表,可能遗留异常数据或结构:
错误代码:
db.execSQL("DROP TABLE IF EXISTS TABLE_NAME");
改成:
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
4. 可选优化:将时间戳转为可读格式(提升用户体验)
目前你直接显示long型的时间戳,用户完全看不懂,建议在Adapter里把它转成友好的日期字符串:
// 在LimitsAdapter的getView方法里替换timestamp的设置代码 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()); String formattedTime = sdf.format(new Date(entry.getTime())); timestamp.setText(formattedTime);
记得导入相关类:import java.text.SimpleDateFormat;、import java.util.Date;、import java.util.Locale;
修复后验证步骤
- 卸载旧APP(避免数据库版本兼容问题),重新安装
- 设置限速,然后模拟超速(可以用GPS模拟器或者真机移动测试)
- 进入LimitsList页面,就能看到正确的速度、经纬度和时间记录了
内容的提问来源于stack exchange,提问作者Step1Gaming
相关产品推荐
相关产品推荐

