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

时间:2015-04-20 23:16:09

标签: java android sqlite android-arrayadapter

我有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(); }

......也在我的车辆课上。

另外,我没有崩溃,我根本无法根据提供的车辆对象设置选择。

通过记录我确认我正在根据列表行创建正确的对象。所以我的SQL很好。但是我在spinnerPosition中返回-1。

这可以用我的方法吗?或者我必须匹配String而非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;
 }

2 个答案:

答案 0 :(得分:1)

Vehicle v = new Vehicle(getContext(), oilChange.getVehicleId()); 
int spinnerPostion = sAdapter.getPosition(v);
spVehicle.setSelection(spinnerPostion);

我认为您正在使用的上述代码就是问题所在。 您正在使用Vehicle的新实例来获取对象的位置 来自sAdapter。 ArrayAdapter.getPosition(T item)仅适用于您 得到一个对象是适配器的一部分,在你的情况下 将是dataSource.getAllVehicles()的列表。

List<Vehicle> vehicles = dataSource.getAllVehicles();

您将始终获得-1,因为您正在寻找的车辆是新创建的 一个,那不在那个列表中。使用属于您使用的原始列表的Vehicle实例。可能是,通过在数据源中创建一个函数并传递Vehicle ID并返回在调用getAllVehicles时创建的Vehicle实例。

答案 1 :(得分:0)

而不是使用Vehicle对象进行预选,请尝试设置微调器的索引

spVehicle.setSelection(intValueOfPreSelectedPosition);