如何将Spinner默认值设置为null?

我试图让一个微调加载没有选定的价值。 一旦用户select一个值,然后将他们带到另一个页面。

这被certificate是一个问题,因为目前,页面只是在用户selectselect之前立即加载。

我的微调类的设置方式与Google相同: http : //developer.android.com/resources/tutorials/views/hello-spinner.html

所以基本上,是否有可能加载没有选中的微调,因为目前,它加载我的string数组中的第一个项目。

Solutions Collecting From Web of "如何将Spinner默认值设置为null?"

有没有可能有一个微调加载没有select

只有在没有数据的情况下 如果您在SpinnerAdapter有1+项, Spinner将始终有一个select。

Spinners器不是被devise成命令小部件的。 用户不会期望Spinner的select开始活动。 请考虑使用其他的东西,比如ListView或者GridView ,而不是Spinner


编辑

顺便说一句,我忘了提及 – 你总是可以在你的适配器中添加一个代表“无select”的额外条目,并将其作为Spinner的初始选定项。

或者,您可以重写您的微调适配器,并在getView方法中为位置0提供一个空视图,并在getDropDownView方法中提供一个0dp高度的视图。

这样,你有一个初始文本,如“select一个选项…”,显示在第一次加载微调框,但它不是一个选项供用户select(技术上是这样,但因为高度为0 ,他们看不到)。

这是Paul Bourdeaux思想的完整实现,即在位置0的getView()返回一个特殊的初始视图(或空视图)。

它适用于我,相对简单。 您可能会考虑这种方法,特别是如果您已经有一个自定义适配器为您的微调。 (在我的例子中,我使用自定义适配器来轻松地自定义项目的布局,每个项目都有一对TextView。)

适配器将沿着这些线:

 public class MySpinnerAdapter extends ArrayAdapter<MyModel> { public MySpinnerAdapter(Context context, List<MyModel> items) { super(context, R.layout.my_spinner_row, items); } @Override public View getDropDownView(int position, View convertView, @NonNull ViewGroup parent) { if (position == 0) { return initialSelection(true); } return getCustomView(position, convertView, parent); } @NonNull @Override public View getView(int position, View convertView, @NonNull ViewGroup parent) { if (position == 0) { return initialSelection(false); } return getCustomView(position, convertView, parent); } @Override public int getCount() { return super.getCount() + 1; // Adjust for initial selection item } private View initialSelection(boolean dropdown) { // Just an example using a simple TextView. Create whatever default view // to suit your needs, inflating a separate layout if it's cleaner. TextView view = new TextView(getContext()); view.setText(R.string.select_one); int spacing = getContext().getResources().getDimensionPixelSize(R.dimen.spacing_smaller); view.setPadding(0, spacing, 0, spacing); if (dropdown) { // Hidden when the dropdown is opened view.setHeight(0); } return view; } private View getCustomView(int position, View convertView, ViewGroup parent) { // Distinguish "real" spinner items (that can be reused) from initial selection item View row = convertView != null && !(convertView instanceof TextView) ? convertView : LayoutInflater.from(getContext()).inflate(R.layout.my_spinner_row, parent, false); position = position - 1; // Adjust for initial selection item MyModel item = getItem(position); // ... Resolve views & populate with data ... return row; } } 

而已。 请注意,如果您在Spinner中使用OnItemSelectedListener ,那么在onItemSelected()您还必须调整position以考虑默认项目,例如:

 if (position == 0) { return; } else { position = position - 1; } MyModel selected = items.get(position); 

就我而言,虽然尺寸“2”显示在微调框中,但直到完成一些select才会发生任何事情!

我有一个XML文件(data_sizes.xml),其中列出了所有的微调值。

 <?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="chunks"> <item>2</item> <item>4</item> <item>8</item> <item>16</item> <item>32</item> </string-array> </resources> 

在main.xml文件中:Spinner元素

 <Spinner android:id="@+id/spinnerSize" android:layout_marginLeft="50px" android:layout_width="fill_parent" android:drawSelectorOnTop="true" android:layout_marginTop="5dip" android:prompt="@string/SelectSize" android:layout_marginRight="30px" android:layout_height="35px" /> 

然后在我的java代码中,我添加了:

在我的活动:宣言

 Spinner spinnerSize; ArrayAdapter adapter; 

在一个公共的无效函数 – initControls():定义

 spinnerSize = (Spinner)findViewById(R.id.spinnerSize); adapter = ArrayAdapter.createFromResource(this, R.array.chunks, android.R.layout.simple_spinner_item); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinnerSize.setAdapter(adapter); spinnerSize.setOnItemSelectedListener(new MyOnItemSelectedListener()); 

我的微调听众:

/ * Spinner监听器* /

 class MyOnItemSelectedListener implements OnItemSelectedListener { public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { chunkSize = new Integer(parent.getItemAtPosition(pos).toString()).intValue(); } public void onNothingSelected(AdapterView<?> parent) { // Dummy } } 

使用像这样的自定义微调器布局:

 <?xml version="1.0" encoding="utf-8"?> <Spinner xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/spinnerTarget" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="14dp" android:textColor="#000000"/> 

在活动中:

  // populate the list ArrayList<String> dataList = new ArrayList<String>(); for (int i = 0; i < 4; i++) { dataList.add("Item"); } // set custom layout spinner_layout.xml and adapter Spinner spinnerObject = (Spinner) findViewById(R.id.spinnerObject); ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this, R.drawable.spinner_layout, dataList); dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinnerObject.setAdapter(dataAdapter); spinnerObject.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { // to set value of first selection, because setOnItemSelectedListener will not dispatch if the user selects first element TextView spinnerTarget = (TextView)v.findViewById(R.id.spinnerTarget); spinnerTarget.setText(spinnerObject.getSelectedItem().toString()); return false; } }); spinnerObject.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { private boolean selectionControl = true; public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { // just the first time if(selectionControl){ // find TextView in layout TextView spinnerTarget = (TextView)parent.findViewById(R.id.spinnerTarget); // set spinner text empty spinnerTarget.setText(""); selectionControl = false; } else{ // select object } } public void onNothingSelected(AdapterView<?> parent) { } }); 

你可以把你的数组中的第一个单元格设置为空({“”,“some”,“some”,…}),如果位置是0,

 public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { if(position>0) { label.setText(MainActivity.questions[position - 1]); } } 
  • 如果你通过xml文件填充数组,你可以让第一个项目为空

我的解决scheme,万一你有一个TextView作为微调的每一行:

  // TODO: add a fake item as the last one of "items" final ArrayAdapter<String> adapter=new ArrayAdapter<String>(..,..,items) { @Override public View getDropDownView(final int position,final View convertView,final ViewGroup parent) { final View dropDownView=super.getDropDownView(position,convertView,parent); ((TextView)dropDownView.findViewById(android.R.id.text1)).setHeight(position==getCount()-1?0:getDimensionFromAttribute(..,R.attr.dropdownListPreferredItemHeight)); dropDownView.getLayoutParams().height=position==getCount()-1?0:LayoutParams.MATCH_PARENT; return dropDownView; } } ... spinner.setAdapter(adapter); _actionModeSpinnerView.setSelection(dataAdapter.getCount()-1,false); public static int getDimensionFromAttribute(final Context context,final int attr) { final TypedValue typedValue=new TypedValue(); if(context.getTheme().resolveAttribute(attr,typedValue,true)) return TypedValue.complexToDimensionPixelSize(typedValue.data,context.getResources().getDisplayMetrics()); return 0; } 

合并这个:

 private long previousItemId = 0; @Override public long getItemId(int position) { long nextItemId = random.nextInt(Integer.MAX_VALUE); while(previousItemId == nextItemId) { nextItemId = random.nextInt(Integer.MAX_VALUE); } previousItemId = nextItemId; return nextItemId; } 

有了这个答案 :

 public class SpinnerInteractionListener implements AdapterView.OnItemSelectedListener, View.OnTouchListener { private AdapterView.OnItemSelectedListener onItemSelectedListener; public SpinnerInteractionListener(AdapterView.OnItemSelectedListener selectedListener) { this.onItemSelectedListener = selectedListener; } boolean userSelect = false; @Override public boolean onTouch(View v, MotionEvent event) { userSelect = true; return false; } @Override public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { if(userSelect) { onItemSelectedListener.onItemSelected(parent, view, pos, id); userSelect = false; } } @Override public void onNothingSelected(AdapterView<?> parent) { if(userSelect) { onItemSelectedListener.onNothingSelected(parent); userSelect = false; } } }