【问题标题】:How do I check spinner is empty?如何检查微调器是否为空?
【发布时间】:2018-09-05 15:14:08
【问题描述】:

我需要检查我的微调器是否为空。但是当微调器内部有数据时,它仍然向我显示吐司它是空的,不包含任何数据。主要问题是微调器已经包含数据库中的数据,但程序在再次打开应用程序后不断添加新数据。

主要活动

public class MainActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener {
Spinner spinner;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    spinner = (Spinner) findViewById(R.id.spinner);
    databaseHelper db = new databaseHelper(getApplicationContext());


    if (spinner.getCount() == 0){
        Toast.makeText(MainActivity.this,"Spinner will be populated now",Toast.LENGTH_LONG).show();
        db.insertData();
    }else {
        Toast.makeText(MainActivity.this,"Spinners is already populated",Toast.LENGTH_LONG).show();
    }
    loadData();
}

public void loadData(){
    databaseHelper db = new databaseHelper(getApplicationContext());
    List<String> labels = db.getAllLabels();
    ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_spinner_item, labels);
    dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinner.setAdapter(dataAdapter);
}

@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
    String label = adapterView.getItemAtPosition(i).toString();
    Toast.makeText(adapterView.getContext(),"Selected: "+label,Toast.LENGTH_LONG).show();
}

@Override
public void onNothingSelected(AdapterView<?> adapterView) {

}
}

数据库

public databaseHelper(Context context) {
    super(context, DATABASE_NAME, null, 1);
}

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL("create table " + TABLE_NAME + " (ID INTEGER PRIMARY KEY AUTOINCREMENT," + COLUMN_2 + " TEXT," + COLUMN_3 + " TEXT," + COLUMN_4 + " TEXT)");

}

@Override
public void onUpgrade(SQLiteDatabase db, int i, int i1) {
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
    onCreate(db);
}

public boolean insertData() {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put(COLUMN_2, "1");
    contentValues.put(COLUMN_3, "2");
    contentValues.put(COLUMN_4, "3");
    long result = db.insert(TABLE_NAME, null, contentValues);

    if (result == -1) {
        return false;
    } else
        return true;
}

public List<String> getAllLabels() {
    List<String> labels = new ArrayList<String>();

    String selectQuery = "SELECT  * FROM " + TABLE_NAME;

    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.rawQuery(selectQuery, null);
    if (cursor.moveToFirst()) {
        do {
            labels.add(cursor.getString(1));
            labels.add(cursor.getString(2));
            labels.add(cursor.getString(3));
        } while (cursor.moveToNext());
    }
    cursor.close();
    db.close();

    return labels;
}
}

【问题讨论】:

    标签: android sqlite spinner


    【解决方案1】:

    你不应该做一些耗时的工作,比如从主应用线程调用 db。异步调用 db 例如使用AsyncTask

    您可以像这样获取微调器项目数:

    int count = spinner.getAdapter() != null ? spinner.getAdapter().getCount() : 0;
    

    【讨论】:

    • 谢谢你的提示,但我之前从未使用过 AsyncTask,所以我必须学习这个。现在,我只想让一切正常工作,如果应用程序必须花一些时间来“计算”指令,这没有问题。它只是一个虚拟版本的应用程序。在最终版本中,它将被更好的代码取代。我已将您的字符串放入 Main Activity,但结果仍然相同 - 微调器仍在从 db 下载数据。
    • @Muszy1 确定何时调用 onCreate 微调器刚刚创建并且它是空的,就像它是第一次创建一样。
    • @Muszy1 如果你想重用获取的arrayList,你必须把它放在onSaveInstanceState的一个包中,然后在onCreate重用它。如您所见,onCreate 具有捆绑类型的参数,此捆绑包可能包含已保存的状态,但对于第一次运行,此捆绑包为空。您应该检查该捆绑包不为空,然后取回您保存在其中的内容。你可以保存到 onSaveInstanceState 中,它也有一个 bundle 参数。
    【解决方案2】:

    我已经检查过你的代码并且总是在调用 db.insertData() 因为一开始的微调器 getCount 总是为 0。

    因此,我让您在 MainActivity 中进行了一些更改,并在 Database 类中创建了一个方法来了解何时需要填充数据库。

    MainActivity

    public class MainActivity extends AppCompatActivity implements Spinner.OnItemSelectedListener{
        private Spinner spinner;
        private Database db;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
                spinner = findViewById(R.id.spinner);
                db  = new Database(getApplicationContext());
    
                if(db.shouldPopulate()){
                    db.insertData();
                }
    
                loadData();
            }
    
        public void loadData(){
            List<String> labels = db.getAllLabels();
    
            ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,
                    android.R.layout.simple_spinner_item, labels);
    
            dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            spinner.setOnItemSelectedListener(this);
            spinner.setAdapter(dataAdapter);
    
        }
    
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                String label = adapterView.getItemAtPosition(i).toString();
                Toast.makeText(adapterView.getContext(),"Selected: "+label,Toast.LENGTH_LONG).show();
            }
    
            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {
    
            }
    }
    

    数据库 这里我将insertData方法中结果的条件改为插入的结果。

    我创建了一个方法来知道你应该何时插入数据。

    public boolean insertData() {
            SQLiteDatabase db = this.getWritableDatabase();
            ContentValues contentValues = new ContentValues();
            contentValues.put(COLUMN_2, "1");
            contentValues.put(COLUMN_3, "2");
            contentValues.put(COLUMN_4, "3");
    
            return db.insert(TABLE_NAME, null, contentValues) != -1;
        }
    
        public boolean shouldPopulate(){
            return  getAllLabels().isEmpty();
        }
    

    希望这段代码对你有所帮助。

    重要

    您应该将您的数据库调用包装在后台处理程序中,这对于 Android 应用程序的性能和良好做法非常重要。

    【讨论】:

      【解决方案3】:

      您在哪里向微调器添加数据?你只需声明它:

      spinner = (Spinner) findViewById(R.id.spinner);
      

      您应该使用 Adapter 将数据添加到您的 Spinner:

      // Create an ArrayAdapter using the string array and a default spinner layout
      ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
              R.array.planets_array, android.R.layout.simple_spinner_item);
      // Specify the layout to use when the list of choices appears
      adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
      // Apply the adapter to the spinner
      spinner.setAdapter(adapter);
      

      spinner.getCount() 是什么意思?可能一定是指adapter

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-15
        • 2020-05-29
        • 2018-04-02
        • 2016-04-05
        • 2018-01-08
        • 2020-09-25
        • 2012-01-15
        • 2016-07-16
        相关资源
        最近更新 更多