【问题标题】:How to connect spinner items with data如何将微调器项目与数据连接起来
【发布时间】:2018-09-15 08:43:26
【问题描述】:

我正在尝试为汽车服务构建 Android 应用。我放了一个带有“换油”等项目的微调器。是否可以进行这种活动,当我从微调器中选择一些东西时,应用程序会显示距离下一次更换机油还有多少公里和时间?我应该将 SQLite 与 int 和 time 一起使用吗?

【问题讨论】:

    标签: android sqlite spinner


    【解决方案1】:

    当然可以。使用setOnItemClickListener() 设置监听器并触发您喜欢的任何代码。

    【讨论】:

      【解决方案2】:

      这是一个使用微调器的示例,选择它会显示到下一项更改的距离和当前里程表读数。这是非常基本的,而不是使用服务日期/时间使用里程表读数和(公里)。

      我应该使用带有 int 和 time 的 SQLite 吗?

      • 您可能希望距离和时间两个间隔,因为维修通常以先到者为准(行驶距离或自上次维修以来的时间)示例仅假定距离。。李>

      它基于 3 个表,一张用于 汽车,一张用于 service_items(机油滤清器更换等),然后是映射/参考表(间隔)。这对于每个汽车/服务项目都有一行,每行包括引用的汽车和引用的 service_item、上次维修该项目时的里程表读数和维修间隔。

      它有一个微调器,可让您选择服务项目,选择服务项目会显示该项目的下一个服务需要多长时间。

      数据库助手,DBHelper.java(SQLiteOpenHelper 类的子类)是:-

      public class DBHelper extends SQLiteOpenHelper {
      
          public static final String DBNAME = "service";
          public static final int DBVERSION = 1;
          public static final String TBITEM = "service_item";
          public static final String TBCAR = "car";
          public static final String TBINTERVAL = "interval";
      
          public static final String COL_TBITEMS_ID = BaseColumns._ID;
          public static final String COL_TBITEMS_NAME = "item_name";
          static final String crt_items_sql = "CREATE TABLE IF NOT EXISTS " +
                  TBITEM + "(" +
                  COL_TBITEMS_ID + " INTEGER PRIMARY KEY, " +
                  COL_TBITEMS_NAME + " TEXT " +
                  ")";
      
          public static final String COL_TBCAR_ID = BaseColumns._ID;
          public static final String COL_TBCAR_OWNERNAME = "owner_name";
          public static final String COL_TBCAR_ODOMETER = "odometer";
          static final String crt_car_sql = "CREATE TABLE IF NOT EXISTS " +
                  TBCAR + "(" +
                  COL_TBCAR_ID + " INTEGER PRIMARY KEY, " +
                  COL_TBCAR_OWNERNAME + " TEXT, " +
                  COL_TBCAR_ODOMETER + " INTEGER " +
                  ")";
      
          public static final String COL_TBINTERVAL_ITEMREF = "item_id_reference";
          public static final String COL_TBINTERVAL_CARREF = "car_id_reference";
          public static final String COL_TBINTERVAL_INTERVAL = "item_interval";
          public static final String COL_TBINTERVAL_LASTDONE = "item_last_done";
          static final String crt_intervals_sql = "CREATE TABLE IF NOT EXISTS " +
                  TBINTERVAL + "(" +
                  COL_TBINTERVAL_ITEMREF + " INTEGER REFERENCES " + TBITEM + "(" + COL_TBITEMS_ID + ")," +
                  COL_TBINTERVAL_CARREF + " INTEGER REFERENCES " + TBCAR + "(" + COL_TBCAR_ID + ")," +
                  COL_TBINTERVAL_INTERVAL + " INTEGER, " +
                  COL_TBINTERVAL_LASTDONE + " INTEGER DEFAULT 0 " +
                  ")";
      
          SQLiteDatabase mDB;
      
          public DBHelper(Context context) {
              super(context, DBNAME, null, DBVERSION);
              mDB = this.getWritableDatabase();
          }
      
          @Override
          public void onCreate(SQLiteDatabase db) {
              db.execSQL(crt_items_sql);
              db.execSQL(crt_car_sql);
              db.execSQL(crt_intervals_sql);
          }
      
          @Override
          public void onUpgrade(SQLiteDatabase db, int i, int i1) {
      
          }
      
          public long addCar(String name, long odometer) {
              ContentValues cv = new ContentValues();
              cv.put(COL_TBCAR_OWNERNAME,name);
              cv.put(COL_TBCAR_ODOMETER,odometer);
              return mDB.insert(TBCAR,null,cv);
          }
      
          public long addItem(String name) {
              ContentValues cv = new ContentValues();
              cv.put(COL_TBITEMS_NAME,name);
              return mDB.insert(TBITEM,null,cv);
          }
      
          public long addInterval(long item_id, long car_id, long interval, long last_done) {
              ContentValues cv = new ContentValues();
              cv.put(COL_TBINTERVAL_ITEMREF, item_id);
              cv.put(COL_TBINTERVAL_CARREF, car_id);
              cv.put(COL_TBINTERVAL_INTERVAL,interval);
              cv.put(COL_TBINTERVAL_LASTDONE,last_done);
              return mDB.insert(TBINTERVAL,null,cv);
          }
      
      
          public long getCarOdometer(long car_id) {
              long rv = -1;
              Cursor csr = mDB.query(TBCAR,null,null,null,null,null,null);
              if (csr.moveToFirst()) {
                  rv = csr.getLong(csr.getColumnIndex(COL_TBCAR_ODOMETER));
              }
              csr.close();
              return rv;
          }
      
          public long getNextDueForItem(long car_id, long item_id) {
              long rv = -1;
              long odometer = getCarOdometer(car_id);
              long last_done = 0;
              long interval = 0;
              String whereclause = COL_TBINTERVAL_ITEMREF + "=? AND " + COL_TBINTERVAL_CARREF + "=?";
              String[] whereargs = new String[]{String.valueOf(item_id),String.valueOf(car_id)};
              Cursor csr = mDB.query(TBINTERVAL,null,whereclause,whereargs,null,null,null);
              if (csr.moveToFirst()) {
                  last_done = csr.getLong(csr.getColumnIndex(COL_TBINTERVAL_LASTDONE));
                  interval = csr.getLong(csr.getColumnIndex(COL_TBINTERVAL_INTERVAL));
                  long dueat = last_done + interval;
                  rv = dueat - odometer;
              }
              csr.close();
              return rv;
          }
      }
      

      Activity MainActivity.java 是:-

      public class MainActivity extends AppCompatActivity {
      
          Spinner mSpinner;
          TextView mSpinner_selection;
          ArrayAdapter<String> mSA;
          ArrayList<String> items = new ArrayList<>(
                  Arrays.asList("Change Oil","Change Oil Filter","Change Air Filter","Change Spark Plugs")
          );
          DBHelper mDBHlpr;
          long mCurrentCar = 1;
      
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
      
              mSpinner = this.findViewById(R.id.spinner);
              mSpinner_selection = this.findViewById(R.id.selected_spinner);
              mSpinner_selection.setText("Nothing selected as yet"); //<<<< will likely not be seen
      
              // Instaiate the Database Helper (will create the Database and tables when first run)
              mDBHlpr = new DBHelper(this);
              addSomeData();
              handleSpinner();
          }
      
          // Setup the Spinner and the Item Select Listener
          private void handleSpinner() {
              if (mSA == null) {
                  mSA = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,items);
                  mSpinner.setAdapter(mSA);
                  mSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                      @Override
                      public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                          //<<<<<<<<<< NOTE not the best way as assumes a direct map
                          // from the list to the service_item.
                          long duein = mDBHlpr.getNextDueForItem(mCurrentCar,(long)i + 1);
                          long odometer = mDBHlpr.getCarOdometer(mCurrentCar);
                          String text_to_show =
                                  "You are due to " + mSA.getItem(i) + " in " + String.valueOf(duein) +
                                          "Your Odometer reads " + String.valueOf(odometer);
                          mSpinner_selection.setText(text_to_show);
                      }
                      @Override
                      public void onNothingSelected(AdapterView<?> adapterView) {
                      }
                  });
              }
          }
      
          // Add some data, a car and the service items based upon the ArrayList of items
          // noting that for display purposes the interval increase per service_item
          private void addSomeData() {
              long thiscar = mDBHlpr.addCar("My Car",1123);
              long interval = 10000;
              for (String s: items) {
                  long thisitem = mDBHlpr.addItem(s);
                  mDBHlpr.addInterval(thisitem,thiscar,interval,0);
                  interval = interval + 500;
              }
          }
      }
      

      MainActivity 的布局是 activity_main.xml 是:-

      <?xml version="1.0" encoding="utf-8"?>
      <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:tools="http://schemas.android.com/tools"
          android:orientation="vertical"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          tools:context=".MainActivity">
      
          <TextView
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:text="Hello World!" />
      
          <Spinner
              android:id="@+id/spinner"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content">
          </Spinner>
      
          <TextView
              android:id="@+id/selected_spinner"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content" />
      </LinearLayout>
      
      • 注意这只是一个演示,展示如何使用微调器。
      • 首次运行时会显示:-

      • 选择更换机油滤清器将显示:-

      • 10500,因为在 MainActivity 的 addSomeData 方法中,500 逐渐添加到服务区间(只是为了显示不同的数据)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-04-10
        • 2021-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多