来自Db的Android Spinner - 默认值= null?

时间:2011-03-17 20:46:01

标签: android spinner

所以,目前我有一个从数据库表中填充的微调器。在使用微调器时,微调器中的第一个值就是数据库中第一个不太理想的值。

旋转器是否有一种很好的方法可以在不插入空白记录或其他任何内容的情况下开始空白?

3 个答案:

答案 0 :(得分:1)

好吧,您可以使用prompt视图的属性Spinner,无论是android:prompt="whatever"还是setPrompt("whatever") 我希望这有帮助


抱歉,我误读了,我不知道有什么办法不显示初始值而不必添加空值。您必须提供与“无选择”值对应的项目。

答案 1 :(得分:1)

所以看起来这不太可能,相反,我已经选择了另一种方法,在数据库中的位置1添加一行,并使用我选择的名称,并修改了一个查询,以便该字段不能被删除。

答案 2 :(得分:0)

如果需要,有一个decorater spinnerAdapter会自动添加一个默认值:



    protected class SpinnerAdapterWithNoValue implements SpinnerAdapter {

            private SpinnerAdapter _current;
            private final static String defaultValue = "Choisir";

            public SpinnerAdapterWithNoValue(SpinnerAdapter base) {
                _current = base;
            }

            @Override
            public int getCount() {
                // TODO Auto-generated method stub
                return _current.getCount()+1;
            }

            @Override
            public Object getItem(int arg0) {
                // TODO Auto-generated method stub
                if(arg0 == 0 || arg0 == -1)
                {
                    return null;
                }
                return _current.getItem(arg0-1);
            }

            @Override
            public long getItemId(int arg0) {
                // TODO Auto-generated method stub
                if(arg0 == 0 || arg0 == -1)
                {
                    return -1;
                }
                return _current.getItemId(arg0-1);
            }

            @Override
            public int getItemViewType(int arg0) {
                // TODO Auto-generated method stub
                if(arg0 == 0 || arg0 == -1)
                {
                    return -1;
                }
                return _current.getItemViewType(arg0-1);
            }

            @Override
            public View getView(int arg0, View convertView, ViewGroup parent) {
                // TODO Auto-generated method stub
                if(arg0 == 0 || arg0 == -1)
                {
                    final TextView v = (TextView) ((LayoutInflater)getContext()
                            .getSystemService(Context.LAYOUT_INFLATER_SERVICE))
                            .inflate(R.layout.spinner_text,parent,false);
                    v.setText(defaultValue);
                    return v;
                }
                return _current.getView(arg0-1, convertView, parent);
            }

            @Override
            public int getViewTypeCount() {
                // TODO Auto-generated method stub
                return _current.getViewTypeCount();
            }

            @Override
            public boolean hasStableIds() {
                // TODO Auto-generated method stub
                return _current.hasStableIds();
            }

            @Override
            public boolean isEmpty() {
                // TODO Auto-generated method stub
                return _current.isEmpty();
            }

            @Override
            public void registerDataSetObserver(DataSetObserver arg0) {
                // TODO Auto-generated method stub
                _current.registerDataSetObserver(arg0);
            }

            @Override
            public void unregisterDataSetObserver(DataSetObserver arg0) {
                // TODO Auto-generated method stub
                _current.unregisterDataSetObserver(arg0);
            }

            @Override
            public View getDropDownView(int arg0, View convertView, ViewGroup parent) {
                // TODO Auto-generated method stub
                if(arg0 == 0 || arg0 == -1)
                {
                    CheckedTextView v = (CheckedTextView)((LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(android.R.layout.simple_spinner_dropdown_item,parent,false);
                    v.setText(defaultValue);
                    return v;
                }
                return _current.getDropDownView(arg0-1, convertView, parent);
            }
        }


然后你可以使用这个装饰器创建自己的微调器:




     public class SpinnerWithNoValue extends Spinner {

        public SpinnerWithNoValue(Context context) {
            super(context);
        }

        public SpinnerWithNoValue(Context context, AttributeSet attrs) {
            super(context, attrs);
        }

        public SpinnerWithNoValue(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
        }

        @Override
        public void setAdapter(SpinnerAdapter orig ) {
            final SpinnerAdapter adapter = new SpinnerAdapterWithNoValue(orig);
            super.setAdapter(adapter);

            try {
                final Method m = AdapterView.class.getDeclaredMethod("setNextSelectedPositionInt",int.class);
                m.setAccessible(true);
                m.invoke(this,-1);

                final Method n = AdapterView.class.getDeclaredMethod("setSelectedPositionInt",int.class);
                n.setAccessible(true);
                n.invoke(this,-1);

            } catch( Exception e ) {
                throw new RuntimeException(e);
            }
        }

        /*
         * getSelectedItem
         * renvoi null si la valeur par defaut est séléctionnée
         * @see android.widget.AdapterView#getSelectedItem()
         */
        @Override
        public Object getSelectedItem()
        {
            return super.getSelectedItem();
        }
        }


您只需更改xml布局中的微调器声明:



    com.myproject.SpinnerWithNoValue


如果需要,可以更改代码以设置微调器标签中的默认文本。

如果所选值是默认值,则getItem将返回null,getItemId将返回-1