をSpinner
使用してデータを取得するがありSimpleCursorAdapter
ます。私のカーソルにはいくつかの値がありSpinner
ますが、デフォルトで空のオプションを表示する必要があります。
なんらかの理由でArrayAdapter<String>
、またはこのアプリで使用したくありません。CursorWrapper
Spinner
デフォルトで空のオプションを表示する簡単な方法があるはずです。
をSpinner
使用してデータを取得するがありSimpleCursorAdapter
ます。私のカーソルにはいくつかの値がありSpinner
ますが、デフォルトで空のオプションを表示する必要があります。
なんらかの理由でArrayAdapter<String>
、またはこのアプリで使用したくありません。CursorWrapper
Spinner
デフォルトで空のオプションを表示する簡単な方法があるはずです。
スピナー アダプター ( getDropDownView ) で不要なビューを非表示にすることができます。
私のサンプル コードでは、defaultposition は非表示にする位置です (「値の選択」位置のように)。
public class SpinnerOptionAdapter extends ArrayAdapter<optionsInfos> {
...
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent)
{ // This view starts when we click the spinner.
View row = convertView;
if(row == null)
{
LayoutInflater inflater = context.getLayoutInflater();
row = inflater.inflate(R.layout.product_tab_produit_spinner_layout, parent, false);
}
...
optionsInfos item = data.get(position);
if( (item != null) && ( position == defaultposition)) {
row.setVisibility(View.GONE);
} else {
row.setVisibility(View.VISIBLE);
}
....
return row;
}
...
}
Spinner 用の SimpleCursorAdapter を使用して「空の」オプションなどのレコードを追加するために私が時々使用する方法は、カーソル クエリで UNION 句を使用することです。EMPTY_SPINNER_STRING は、「-- 指定なし --」などのようになります。「order by」句を使用して空のレコードを最初に取得し、スピナーのデフォルト値を取得します。基礎となるテーブル データを変更せずに、必要な結果を取得するための粗雑ですが効果的な方法です。私の例では、特定のスピナーにデフォルトの空の値 (「強度」のモディファイア タイプを持つもの) だけを持たせたいと考えています。
public Cursor getLOV(String modifier_type)
//get the list of values (LOVS) for a given modifier
{
if (mDb == null)
{
this.open();
}
try {
MYSQL = "SELECT _ID AS '_id', code, name, type as 'DESC', ordering FROM "+codeTab+" WHERE type = '"+modifier_type+"'" +
" ORDER BY ordering, LOWER(name)";
if (modifier_type.equals("intensity")) { //then include a default empty record
MYSQL = "SELECT _ID AS '_id', code, name as 'NAME', type as 'DESC', ordering FROM "+codeTab+" WHERE type = '"+modifier_type+"'" +
" UNION SELECT 9999 AS '_id', '' AS 'code', '"+EMPTY_SPINNER_STRING+"' AS 'NAME', 'intensity' AS 'DESC', 1 AS ordering ORDER BY ordering, name";
}
Log.d(TAG, "MYSQL = "+MYSQL);
return mDb.rawQuery(MYSQL, null);
}
catch (SQLiteException exception) {
Log.e("Database LOV query", exception.getLocalizedMessage());
return null;
}
}
Spinner
OnItemSelectedListener
はコンパイル時にも実行され、選択されたアイテムで表示する最初のアイテムをフェッチしますSpinner
。
にダミー項目 (String - null " "
) を追加してSimpleCursorAdapter
使用しますspinner.setSelected(int thatSpecificPostionYouJustAdded)
。
アダプターをセットした後。setSelection (i は 0 で使用) を呼び出し、その直後にテキストの色を透明に設定します。
// Preselect the first to make the spinner text transparent
spinner.setSelection(0, false);
TextView selectedView = (TextView) spinner.getSelectedView();
if (selectedView != null) {
selectedView.setTextColor(getResources().getColor(R.color.transparent));
}
次に、OnItemSelectedListener を設定します (必要な場合)。
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
これにより、最初に見たときにスピナーが空になります。ただし、ユーザーが最初の項目を選択しても、0 が事前に選択されているため、何もしません。これを修正するために、スピナーのこのサブクラスを使用しました。@melquiadesの回答から取得:
/**
* Spinner extension that calls onItemSelected even when the selection is the same as its previous value
*/
public class FVRSpinner extends Spinner {
public FVRSpinner(Context context) {
super(context);
}
public FVRSpinner(Context context, AttributeSet attrs) {
super(context, attrs);
}
public FVRSpinner(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public void setSelection(int position, boolean animate) {
boolean sameSelected = position == getSelectedItemPosition();
super.setSelection(position, animate);
if (sameSelected) {
// Spinner does not call the OnItemSelectedListener if the same item is selected, so do it manually now
if (getOnItemSelectedListener() != null) {
getOnItemSelectedListener().onItemSelected(this, getSelectedView(), position, getSelectedItemId());
}
}
}
@Override
public void setSelection(int position) {
boolean sameSelected = position == getSelectedItemPosition();
super.setSelection(position);
if (sameSelected) {
// Spinner does not call the OnItemSelectedListener if the same item is selected, so do it manually now
if (getOnItemSelectedListener() != null) {
getOnItemSelectedListener().onItemSelected(this, getSelectedView(), position, getSelectedItemId());
}
}
}
}