无法使用对象设置Spinner的选择值

3
我有一个像这样的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);

我希望能够预先选择下拉菜单中的选项值,所以我认为我需要使用与之匹配的“车辆对象”来预先选择它,对吗?
请注意,这是在一个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

编辑:这是我的可行代码

  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个回答

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实例。可能需要在数据源中创建一个函数,传递车辆ID并返回创建所有车辆时所创建的Vehicle实例。

1
谢谢,我通过传递“Vehicle”列表和“id”创建了一个查找函数,并返回了正确的“vehicle”,现在旋转器已经准确设置。 - TheLettuceMaster

0

不要使用Vehicle对象进行预选,尝试设置Spinner的索引。

spVehicle.setSelection(intValueOfPreSelectedPosition);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接