Удаление последнего элемента из счетчика удаляет весь список - PullRequest
5 голосов
/ 11 мая 2011

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

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

Мой код выглядит следующим образом:

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

    // grab our UI elements so we can manipulate them (for the Spinner)
    // or add listeners to them (in the case of the buttons)
    m_myDynamicSpinner = (Spinner)findViewById(R.id.dynamicSpinner);
    m_addItemText = (EditText)findViewById(R.id.newSpinnerItemText);
    Button addButton = (Button)findViewById(R.id.AddBtn);
    Button clearButton = (Button)findViewById(R.id.ClearBtn);

    // create an arrayAdapter an assign it to the spinner
    m_adapterForSpinner = new ArrayAdapter(this, android.R.layout.simple_spinner_item);
        ((ArrayAdapter)m_adapterForSpinner).setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    m_myDynamicSpinner.setAdapter(m_adapterForSpinner);

    // add listener for addButton
    addButton.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            addNewSpinnerItem();
        }
    });

    clearButton.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            clearSpinnerItems();
        }
    });
}

// add listener for addButton
private void addNewSpinnerItem() {
    if (m_addItemText.getText().length() == 0) {
        Toast.makeText(getApplicationContext(), "The textView is empty", Toast.LENGTH_LONG).show();
    } else {
        CharSequence textHolder = "" + m_addItemText.getText();
        ((ArrayAdapter) m_adapterForSpinner).add(textHolder);
    }
    m_addItemText.setText("");
}

private void clearSpinnerItems() {
    m_myDynamicSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {

        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
            Object t = m_adapterForSpinner.getItem(pos);
            ((ArrayAdapter) m_adapterForSpinner).remove((CharSequence) t);
        }

        @Override
        public void onNothingSelected(AdapterView<?> arg0) {
            // TODO
        }
    });
}

Есть ли у кого-нибудь какие-либо идеи или предложения о том, как сделать эту работу?

Ответы [ 2 ]

4 голосов
/ 24 мая 2011

Проблема с вашим кодом состоит в том, что удаление находится внутри обратного вызова onItemSelected, который вызывается каждый раз, когда вы удаляете запись, таким образом, рекурсивное удаление, пока у вас фактически не останется больше записей для выбора.Если вы добавите журнал внутри этого метода:

Log.d("Spinner", "Count: " + m_adapterForSpinner.getCount());

, вы поймете, что я имею в виду.Я уверен, что вы можете придумать более элегантный код, но быстрый и грязный взлом состоит в том, чтобы установить логический флаг, чтобы остановить рекурсию после первого удаления.Посмотрите фрагмент ниже и добавьте закомментированные строки в свой собственный код:

public class SpinnerTest extends Activity {
    Spinner m_myDynamicSpinner;
    EditText m_addItemText;
    ArrayAdapter m_adapterForSpinner;

    public static boolean cleared = false;  //   <--- set up a static boolean here

       @Override
        public void onCreate(Bundle savedInstanceState) {
// all your code unchanged

        clearButton.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {

                cleared=false;   //   <--- nope, we did not clear the value yet

                clearSpinnerItems();
            }
        });
    }

// code unchanged

    private void clearSpinnerItems() {
        m_myDynamicSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {

            public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
                Object t = m_adapterForSpinner.getItem(pos);
                Log.d("Spinner", "Count: " + m_adapterForSpinner.getCount());

                if (!cleared)  //   <--- did I do it already?

                    ((ArrayAdapter) m_adapterForSpinner).remove((CharSequence) t);

                Log.d("Spinner", "Count: " + m_adapterForSpinner.getCount());

                cleared=true;  // I did it!

            }

// code unchanged
1 голос
/ 11 мая 2011

Я не могу понять ваш вопрос. Каким образом вы можете получить позицию выбранного элемента с помощью метода getSelectedItemPosition ().

...