无法使用对象设置微调器选择值
Unable to set Spinner selection value with object
我有一个 spinner
这样的:
List<Vehicle> vehicles = dataSource.getAllVehicles();
Spinner spVehicle = (Spinner) dialog.findViewById(R.id.spVehicle);
SpinnerVehicleAdapter sAdapter = new SpinnerVehicleAdapter(getContext(), R.layout.spinner_textview, vehicles);
spVehicle.setAdapter(sAdapter);
我想预选微调器的下拉值,所以我想我必须用 匹配的 Vehicle
对象 预选它,对吗?
请记住,这是在我可以访问的 ArrayAdapter<Oil>
中:
Oil oilChange;
oilChange.getVehicleId();
所以,有了这些信息,我尝试这样设置它:
Vehicle v = new Vehicle(getContext(), oilChange.getVehicleId());
int spinnerPostion = sAdapter.getPosition(v);
spVehicle.setSelection(spinnerPostion);
补充方法如下:(我相信我已经确认下面的代码不是问题。)
public Vehicle(Context mContext, int vehicleId) {
GasDataSource datasource = new GasDataSource(mContext);
datasource.open();
Vehicle vehicle = datasource.createVehicle(vehicleId);
this.vehicleName = vehicle.getVehicleName();
this.vehicleYear = vehicle.getVehicleYear();
this.vehicleModel = vehicle.getVehicleModel();
this.vehicleMake = vehicle.getVehicleMake();
this.oilDistance = vehicle.getOilDistance();
this.drivenDistance = vehicle.getDrivenDistance();
datasource.close();
}
然后:
public Vehicle createVehicle(long id) {
if (!database.isOpen()) {
open();
}
Vehicle vehicle = new Vehicle();
Cursor cursor = database.query(MySQLiteHelper.TABLE_VEHICLE, allVehColumns, MySQLiteHelper.COLUMN_VEHICLE_ID + " = " + id, null, null, null, null);
while (cursor.moveToNext()) {
vehicle = cursorToVehicle(cursor);
}
// Make sure to close the cursor
cursor.close();
return vehicle;
}
现在,有问题的 spinner
下拉菜单使用 属性 vehicle.vehicleName
;
我有一个:
public String toString() {return getVehicleName(); }
...在我的车里 class。
此外,我没有遇到崩溃,我只是无法根据提供的车辆对象设置选择。
通过日志记录,我已确认我正在根据列表行创建正确的对象。所以我的 SQL
很好。但是我return-1在spinnerPosition
.
这在我的方法中可行吗?还是我必须匹配 String
s 而不是 Object
s?
编辑:这是我的工作代码
Vehicle v = dataSource.findVehicle(oilChange.getVehicleId(), vehicles);
if (v != null) {
int spinnerPostion = sAdapter.getPosition(v);
spVehicle.setSelection(spinnerPostion);
}
public Vehicle findVehicle(long id, List<Vehicle> list) {
for(Vehicle vehicle : list) {
if(vehicle.getId() == id) {
return vehicle;
}
}
return null;
}
尝试设置微调器的索引,而不是使用 Vehicle 对象进行预选
spVehicle.setSelection(intValueOfPreSelectedPosition);
Vehicle v = new Vehicle(getContext(), oilChange.getVehicleId());
int spinnerPostion = sAdapter.getPosition(v);
spVehicle.setSelection(spinnerPostion);
我认为您使用的上述代码是问题所在。
您正在使用 Vehicle 的新实例来获取对象的位置
从 sAdapter。 ArrayAdapter.getPosition(T 项目) 只有当你
正在获取一个对象,该对象是适配器的一部分,在您的情况下
将是来自 dataSource.getAllVehicles() 的列表。
List<Vehicle> vehicles = dataSource.getAllVehicles();
您将始终获得 -1,因为您正在寻找的车辆是新创建的
一个,那不在该列表中。使用属于您使用的原始列表的 Vehicle 实例。可能是通过在您的数据源中创建一个函数并传递 Vehicle ID 并返回您在调用 getAllVehicles 时创建的 Vehicle 实例。
我有一个 spinner
这样的:
List<Vehicle> vehicles = dataSource.getAllVehicles();
Spinner spVehicle = (Spinner) dialog.findViewById(R.id.spVehicle);
SpinnerVehicleAdapter sAdapter = new SpinnerVehicleAdapter(getContext(), R.layout.spinner_textview, vehicles);
spVehicle.setAdapter(sAdapter);
我想预选微调器的下拉值,所以我想我必须用 匹配的 Vehicle
对象 预选它,对吗?
请记住,这是在我可以访问的 ArrayAdapter<Oil>
中:
Oil oilChange;
oilChange.getVehicleId();
所以,有了这些信息,我尝试这样设置它:
Vehicle v = new Vehicle(getContext(), oilChange.getVehicleId());
int spinnerPostion = sAdapter.getPosition(v);
spVehicle.setSelection(spinnerPostion);
补充方法如下:(我相信我已经确认下面的代码不是问题。)
public Vehicle(Context mContext, int vehicleId) {
GasDataSource datasource = new GasDataSource(mContext);
datasource.open();
Vehicle vehicle = datasource.createVehicle(vehicleId);
this.vehicleName = vehicle.getVehicleName();
this.vehicleYear = vehicle.getVehicleYear();
this.vehicleModel = vehicle.getVehicleModel();
this.vehicleMake = vehicle.getVehicleMake();
this.oilDistance = vehicle.getOilDistance();
this.drivenDistance = vehicle.getDrivenDistance();
datasource.close();
}
然后:
public Vehicle createVehicle(long id) {
if (!database.isOpen()) {
open();
}
Vehicle vehicle = new Vehicle();
Cursor cursor = database.query(MySQLiteHelper.TABLE_VEHICLE, allVehColumns, MySQLiteHelper.COLUMN_VEHICLE_ID + " = " + id, null, null, null, null);
while (cursor.moveToNext()) {
vehicle = cursorToVehicle(cursor);
}
// Make sure to close the cursor
cursor.close();
return vehicle;
}
现在,有问题的 spinner
下拉菜单使用 属性 vehicle.vehicleName
;
我有一个:
public String toString() {return getVehicleName(); }
...在我的车里 class。
此外,我没有遇到崩溃,我只是无法根据提供的车辆对象设置选择。
通过日志记录,我已确认我正在根据列表行创建正确的对象。所以我的 SQL
很好。但是我return-1在spinnerPosition
.
这在我的方法中可行吗?还是我必须匹配 String
s 而不是 Object
s?
编辑:这是我的工作代码
Vehicle v = dataSource.findVehicle(oilChange.getVehicleId(), vehicles);
if (v != null) {
int spinnerPostion = sAdapter.getPosition(v);
spVehicle.setSelection(spinnerPostion);
}
public Vehicle findVehicle(long id, List<Vehicle> list) {
for(Vehicle vehicle : list) {
if(vehicle.getId() == id) {
return vehicle;
}
}
return null;
}
尝试设置微调器的索引,而不是使用 Vehicle 对象进行预选
spVehicle.setSelection(intValueOfPreSelectedPosition);
Vehicle v = new Vehicle(getContext(), oilChange.getVehicleId()); int spinnerPostion = sAdapter.getPosition(v); spVehicle.setSelection(spinnerPostion);
我认为您使用的上述代码是问题所在。 您正在使用 Vehicle 的新实例来获取对象的位置 从 sAdapter。 ArrayAdapter.getPosition(T 项目) 只有当你 正在获取一个对象,该对象是适配器的一部分,在您的情况下 将是来自 dataSource.getAllVehicles() 的列表。
List<Vehicle> vehicles = dataSource.getAllVehicles();
您将始终获得 -1,因为您正在寻找的车辆是新创建的 一个,那不在该列表中。使用属于您使用的原始列表的 Vehicle 实例。可能是通过在您的数据源中创建一个函数并传递 Vehicle ID 并返回您在调用 getAllVehicles 时创建的 Vehicle 实例。