如何制作带有初始文本“Select One”的Android Spinner?
Posted
技术标签:
【中文标题】如何制作带有初始文本“Select One”的Android Spinner?【英文标题】:How to make an Android Spinner with initial text "Select One"? 【发布时间】:2010-10-26 10:25:50 【问题描述】:我想使用最初(当用户尚未做出选择时)显示文本“选择一个”的 Spinner。当用户单击微调器时,将显示项目列表并且用户选择其中一个选项。用户做出选择后,所选项目会显示在 Spinner 中,而不是“Select One”。
我有以下代码来创建 Spinner:
String[] items = new String[] "One", "Two", "Three";
Spinner spinner = (Spinner) findViewById(R.id.mySpinner);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item, items);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
使用此代码,最初会显示项目“One”。我可以在项目中添加一个新项目“Select One”,但随后“Select One”也会作为第一项显示在下拉列表中,这不是我想要的。
我该如何解决这个问题?
【问题讨论】:
完美的解决方案在于这个问题:***.com/questions/9863378/…只需覆盖getDropDownView()方法。 您是否尝试将适配器的第一个元素设置为“选择一个”? [这里有其他很棒的解决方案!][1] [1]: ***.com/questions/9863378/… 可重复使用的微调器:github.com/henrychuangtw/ReuseSpinner android--code.blogspot.in/2015/08/android-spinner-hint.html 又一个好教程 【参考方案1】:public AdapterView.OnItemSelectedListener instructorSpinnerListener = new AdapterView.OnItemSelectedListener()
@Override
public void onItemSelected(AdapterView << ? > adapterView, View view, int i, long l)
String selectedInstructorName = adapterView.getItemAtPosition(i).toString();
if (selectedInstructorName.equals("[Select Instructor]"))
instructorSpinnerAdapter.clear();
for (Offering offering: allOfferingsList)
instructorSpinnerAdapter.add(offering);
else
instructorSpinnerAdapter.clear();
@Override
public void onNothingSelected(AdapterView<< ? > adapterView)
adapterView.setSelection(0);
// Toast.makeText(getApplicationContext(), "Why?", Toast.LENGTH_SHORT).show();
;
【讨论】:
【参考方案2】:如果您遇到此问题当您的项目是从数据库光标填充时,
我在this SO answer中找到的最简单的解决方案:
在您的游标适配器查询中使用 UNION 并将 id= -1 的附加项添加到查询结果中,而不是真正将其添加到数据库中:
类似:
db.rawQuery("SELECT iWorkerId as _id, nvLastName as name FROM Worker
w UNION SELECT -1 as _id , '' as name",null);
如果选择的项目是-1,那么它是默认值。否则 这是表格中的记录。
【讨论】:
【参考方案3】:String[] listAges = getResources().getStringArray(R.array.ages);
// Creating adapter for spinner
ArrayAdapter<String> dataAdapter =
new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, listAges);
// Drop down layout style - list view with radio button
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
// attaching data adapter to spinner
spinner_age.getBackground().setColorFilter(ContextCompat.getColor(this, R.color.spinner_icon), PorterDuff.Mode.SRC_ATOP);
spinner_age.setAdapter(dataAdapter);
spinner_age.setSelection(0);
spinner_age.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
String item = parent.getItemAtPosition(position).toString();
if(position > 0)
// get spinner value
Toast.makeText(parent.getContext(), "Age..." + item, Toast.LENGTH_SHORT).show();
else
// show toast select gender
Toast.makeText(parent.getContext(), "none" + item, Toast.LENGTH_SHORT).show();
@Override
public void onNothingSelected(AdapterView<?> parent)
);
【讨论】:
【参考方案4】:private boolean isFirst = true;
private void setAdapter()
final ArrayList<String> spinnerArray = new ArrayList<String>();
spinnerArray.add("Select your option");
spinnerArray.add("Option 1");
spinnerArray.add("Option 2");
spin.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()
@Override
public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id)
TextView tv = (TextView)selectedItemView;
String res = tv.getText().toString().trim();
if (res.equals("Option 1"))
//do Something
else if (res.equals("Option 2"))
//do Something else
@Override
public void onNothingSelected(AdapterView<?> parentView)
);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.my_spinner_style,spinnerArray)
public View getView(int position, View convertView, ViewGroup parent)
View v = super.getView(position, convertView, parent);
int height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 25, getResources().getDisplayMetrics());
((TextView) v).setTypeface(tf2);
((TextView) v).getLayoutParams().height = height;
((TextView) v).setGravity(Gravity.CENTER);
((TextView) v).setTextSize(TypedValue.COMPLEX_UNIT_SP, 19);
((TextView) v).setTextColor(Color.WHITE);
return v;
public View getDropDownView(int position, View convertView,
ViewGroup parent)
if (isFirst)
isFirst = false;
spinnerArray.remove(0);
View v = super.getDropDownView(position, convertView, parent);
((TextView) v).setTextColor(Color.argb(255, 70, 70, 70));
((TextView) v).setTypeface(tf2);
((TextView) v).setGravity(Gravity.CENTER);
return v;
;
spin.setAdapter(adapter);
【讨论】:
【参考方案5】:考虑有 N 个项目可供选择。
添加这N项后,将提示文本添加为第(N+1)项。
将所选项目设置为第 N 个位置 [(N+1) 个项目]。
在您的 OnItemSelected Listener 中,如果选中的位置不是 N,则弹出最后一项并调用 Adapter.notifyDataSetChanged() 并将选中的项目设置为选中的位置。
类似这样的:
spinner.setItems("Daily", "One time", "Frequency"); // here "Frequency is the hint text"
spinner.setSelectedIndex(2);
spinner.setOnItemSelectedListener(new OnItemSelectedListener()
@Override
public void onItemSelected(Spinner view, int position, long id, Object item)
if (position != 2)
view.setItems("Daily", "One time");
view.setSelectedIndex(position);
else
// This item is not a valid selection
);
【讨论】:
【参考方案6】: ArrayList<String> sizes = new ArrayList<>();
spinner = (Spinner) findViewById(R.id.spinner_size);
if (sizes != null && !sizes.isEmpty())
//SORT ArrayList If You Want Data in ASC or DSC Order
sizes.add("28");
sizes.add("29");
sizes.add("31");
sizes.add("Choose Size"); //adding String at the end of ArrayList
Collections.reverse(sizes); //Last Item Will Be Shown As A Spinner Title
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, sizes);
spinner.setAdapter(adapter);
只需使用 arraylist.add("Your Data") 方法在 arrayList 的末尾添加项目,然后使用 Collection.reverse(arrayList) 将其反转,以便标题成为 Spinner 中的第一个项目。您也可以在最后添加数据之前对项目进行排序。
【讨论】:
这个答案没有为问题添加任何新内容。已经提出了这种方法,添加相同的答案只会产生噪音。请在发布新答案之前阅读以前的答案。以上是关于如何制作带有初始文本“Select One”的Android Spinner?的主要内容,如果未能解决你的问题,请参考以下文章
如何制作带有圆形图像和圆形文本的 UI,以及在同一个圆圈上添加评级图标。在 iOS 应用程序中