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

Oli*_*Oli 59 android android-spinner

我试图让Spinner加载没有选定的值.一旦用户选择了一个值,它就会将它们带到另一个页面.

这被证明是一个问题,因为目前,页面只是在用户选择之前立即加载.

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

所以基本上,是否有可能有一个微调器加载没有选择,因为目前,它加载我的字符串数组中的第一个项目.

Com*_*are 81

是否可能有一个没有选择加载的微调器

只有没有数据.如果您有1个以上的项目SpinnerAdapter,Spinner将始终有一个选择.

Spinners不是设计为命令小部件.用户不希望选择a Spinner来启动活动.请考虑使用其他内容,例如a ListViewGridView,而不是a Spinner.


编辑

顺便说一下,我忘了提一下 - 你总是可以在你的适配器中添加一个代表"没有选择"的额外条目,并将其作为初始选中的项目Spinner.

  • 显示项目怎么样?我不希望选择"虚拟人". (8认同)
  • 在这种情况下,ListPopupWindow是更好的选择.通过从textView替换微调器并在textView上调用ListPopupWindow.show(),单击显示相同的行为,没有默认项选择的缺点.有关详细信息,请参阅此https://developer.android.com/reference/android/widget/ListPopupWindow.html (2认同)

小智 29

或者,您可以覆盖您的微调器适配器,并为getView方法中的位置0提供空视图,并在getDropDownView方法中提供高度为0dp的视图.

这样,你有一个初始文本,例如"选择一个选项......",它在首次加载微调器时显示,但它不是用户选择的选项(技术上是这样,但因为高度为0) ,他们看不到它.


Jon*_*nik 20

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

它对我有用,而且相对简单.您可能会考虑这种方法,尤其是如果您已经为Spinner 设置了自定义适配器.(在我的例子中,我使用自定义适配器,以便轻松自定义项目的布局,每个项目都有几个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;
    }

}
Run Code Online (Sandbox Code Playgroud)

而已.请注意,如果您OnItemSelectedListener在Spinner中使用a,则onItemSelected()还需要调整position以将默认项目考虑在内,例如:

if (position == 0) {
    return;
} else {
    position = position - 1;
}
MyModel selected = items.get(position);
Run Code Online (Sandbox Code Playgroud)


The*_*ilk 5

在我的情况下,虽然在微调器中显示大小'2',但在完成某些选择之前没有任何反应!

我有一个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>    
Run Code Online (Sandbox Code Playgroud)

在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" /> 
Run Code Online (Sandbox Code Playgroud)

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

在我的活动中:宣言

Spinner spinnerSize;
ArrayAdapter adapter;
Run Code Online (Sandbox Code Playgroud)

在public void函数中 - initControls():Definition

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());
Run Code Online (Sandbox Code Playgroud)

我的旋转听众:

/*Spinner Listener*/

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
    }
}
Run Code Online (Sandbox Code Playgroud)


gts*_*gts 5

使用如下所示的自定义微调器布局:

<?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"/>
Run Code Online (Sandbox Code Playgroud)

活动中:

    // 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) {

                }
            });
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

119512 次

最近记录:

6 年 前