Android Spinner от Db - значение по умолчанию = ноль? - PullRequest
1 голос
/ 17 марта 2011

Итак, на данный момент у меня есть счетчик, который заполняется из таблицы базы данных. В данный момент при использовании счетчика первое значение в счетчике является только первым из базы данных, которое на самом деле не идеально.

Есть ли у прядильщика хороший способ начать пустое, не вставляя пустую запись или что-то еще?

Ответы [ 3 ]

1 голос
/ 18 марта 2011

Так что, похоже, это не очень возможно, вместо этого я выбрал другой метод добавления строки в позиции 1 в базе данных с именем, которое я выбрал, и изменил запрос так, чтобы поле не моглобыть удаленным.

1 голос
/ 18 марта 2011

Ну, вы можете использовать атрибут prompt представления Spinner, android:prompt="whatever" или setPrompt("whatever") Надеюсь, это поможет


Извините, я неправильно прочитал, я незнать любой способ не показывать начальное значение без добавления пустого значения.Вам нужно будет предоставить элемент, который соответствует значению «нет выбора».

0 голосов
/ 31 января 2013

Если вы хотите, есть decorater spinner. Адаптер автоматически добавляет значение по умолчанию:



    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 вернет ноль, а getItemId вернет -1

...