Как реализовать добавить элемент в адаптере спиннер массива в Android - PullRequest
4 голосов
/ 27 февраля 2011

У меня был EditText, кнопка и счетчик. При нажатии на кнопку счетчик добавит новый элемент с именем, которое вы ввели в EditText. Но вот в чем вопрос, мой метод adaptor.add () кажется не работает ... вот мой код:

  bt1 = (Button)this.findViewById(R.id.AddBtn);
            et = (EditText)this.findViewById(R.id.newSpinnerItemText);  
            spinner = (Spinner)this.findViewById(R.id.dynamicSpinner);

            adapter = ArrayAdapter.createFromResource(
                    this, R.array.simple_from_length, android.R.layout.simple_spinner_item);

            adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

            spinner.setAdapter(adapter);

            bt1.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    String temp = et.getText().toString();

                    adapter.add(temp);
                //    adapter.notifyDataSetChanged();
                    spinner.setAdapter(adapter);

                }
            });

ошибка этого файла:

02-27 18:01:17.728: ERROR/AndroidRuntime(1982): java.lang.UnsupportedOperationException
02-27 18:01:17.728: ERROR/AndroidRuntime(1982):     at java.util.AbstractList.add(AbstractList.java:410)
02-27 18:01:17.728: ERROR/AndroidRuntime(1982):     at java.util.AbstractList.add(AbstractList.java:432)
02-27 18:01:17.728: ERROR/AndroidRuntime(1982):     at android.widget.ArrayAdapter.add(ArrayAdapter.java:178)
02-27 18:01:17.728: ERROR/AndroidRuntime(1982):     at org.example.SpinnerKiran.SpinnerKiran$1.onClick(SpinnerKiran.java:56)
02-27 18:01:17.728: ERROR/AndroidRuntime(1982):     at android.view.View.performClick(View.java:2179)
02-27 18:01:17.728: ERROR/AndroidRuntime(1982):     at android.view.View.onTouchEvent(View.java:3828)
02-27 18:01:17.728: ERROR/AndroidRuntime(1982):     at android.widget.TextView.onTouchEvent(TextView.java:6291)
02-27 18:01:17.728: ERROR/AndroidRuntime(1982):     at android.view.View.dispatchTouchEvent(View.java:3368)
02-27 18:01:17.728: ERROR/AndroidRuntime(1982):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863)
02-27 18:01:17.728: ERROR/AndroidRuntime(1982):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863)
02-27 18:01:17.728: ERROR/AndroidRuntime(1982):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863)
02-27 18:01:17.728: ERROR/AndroidRuntime(1982):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863)
02-27 18:01:17.728: ERROR/AndroidRuntime(1982):     at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1707)
02-27 18:01:17.728: ERROR/AndroidRuntime(1982):     at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1197)
02-27 18:01:17.728: ERROR/AndroidRuntime(1982):     at android.app.Activity.dispatchTouchEvent(Activity.java:1993)
02-27 18:01:17.728: ERROR/AndroidRuntime(1982):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1691)
02-27 18:01:17.728: ERROR/AndroidRuntime(1982):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1525)
02-27 18:01:17.728: ERROR/AndroidRuntime(1982):     at android.os.Handler.dispatchMessage(Handler.java:99)
02-27 18:01:17.728: ERROR/AndroidRuntime(1982):     at android.os.Looper.loop(Looper.java:123)
02-27 18:01:17.728: ERROR/AndroidRuntime(1982):     at android.app.ActivityThread.main(ActivityThread.java:3948)
02-27 18:01:17.728: ERROR/AndroidRuntime(1982):     at java.lang.reflect.Method.invokeNative(Native Method)
02-27 18:01:17.728: ERROR/AndroidRuntime(1982):     at java.lang.reflect.Method.invoke(Method.java:521)
02-27 18:01:17.728: ERROR/AndroidRuntime(1982):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:782)
02-27 18:01:17.728: ERROR/AndroidRuntime(1982):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540)
02-27 18:01:17.728: ERROR/AndroidRuntime(1982):     at dalvik.system.NativeStart.main(Native Method)

Ответы [ 3 ]

7 голосов
/ 27 февраля 2011

ArrayAdapter уже основан на List, поэтому вам не нужно создавать собственный адаптер только для использования List. Тем не менее, он использует список или массив, с помощью которого он создан. Он не копирует элементы в новый список. Если вы дадите ему массив фиксированной длины, вы не сможете добавлять или удалять элементы.

Создать список для передачи конструктору. Обратите внимание, что список, созданный из Arrays.asList (), не будет работать, потому что это просто представление исходного массива.

        spinner = (Spinner)this.findViewById(R.id.dynamicSpinner);
        CharSequence[] itemArray = 
                getResources().getTextArray(R.array.simple_from_length);
        List<CharSequence> itemList = 
                new ArrayList<CharSequence>(Arrays.asList(itemArray));

        adapter = new ArrayAdapter(this, 
                android.R.layout.simple_spinner_item,
                itemList);

        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

        spinner.setAdapter(adapter);

Вы также можете использовать List и getResources.getStringArray (), или что угодно.

1 голос
/ 28 февраля 2011

Вы можете использовать метод добавления, как показано ниже.

m_adapterForSpinner = new ArrayAdapter(this, android.R.layout.simple_spinner_item);  
m_adapterForSpinner.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);        
m_myDynamicSpinner.setAdapter(m_adapterForSpinner);
m_adapterForSpinner.add("dummy item");        

////////////////////////////////////////////////////////////////
addButton.setOnTouchListener(new OnTouchListener(){
    public boolean onTouch(View v, MotionEvent event) {

        final Dialog dialog=new Dialog(roughact.this);
        dialog.setContentView(R.layout.dialog);
        dialog.setTitle("Enter The Item");
        dialog.setCanceledOnTouchOutside(true);

        final EditText filename=(EditText)dialog.findViewById(R.id.filename);
        filename.setText("");

        Button d_ok=(Button)dialog.findViewById(R.id.d_ok);
        Button d_cancel=(Button)dialog.findViewById(R.id.d_cancel);
        d_ok.setOnTouchListener(new OnTouchListener(){
            public boolean onTouch(View v,MotionEvent me){

                CharSequence textHolder = "" + filename.getText();
                m_adapterForSpinner.add(textHolder);

                dialog.dismiss();
                return false;
            }
        });
        d_cancel.setOnTouchListener(new OnTouchListener(){
            public boolean onTouch(View v,MotionEvent me){
                dialog.dismiss();
                return false;
            }
        });
        dialog.show();

        return false;
    }

Попробуйте это .. Это поможет вам.

0 голосов
/ 27 февраля 2011

Вам потребуется создать пользовательский адаптер, который, вероятно, будет основан на List<String>, и самостоятельно реализовать метод add. В методе add вам необходимо добавить внутренний список элементов (строк) адаптера. Результат createFromResource основан на CharSequence[], который возвращается с фиксированным размером и динамически не увеличивается.

...