无法使用对象设置微调器选择值

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.

这在我的方法中可行吗?还是我必须匹配 Strings 而不是 Objects?

编辑:这是我的工作代码

  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 实例。