Android 从微调器中删除最后一项将删除整个列表

Android 从微调器中删除最后一项将删除整个列表,android,spinner,Android,Spinner,我试图使用微调器控件,使用户可以删除任何列表元素。 我有一个“添加”按钮向列表中添加元素,还有一个“删除”按钮从列表中删除当前显示的项目 除用户删除列表中的最后一项外,它的工作方式与预期一致。此时,列表中的所有项目都将被删除 我的代码如下: @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setConten

我试图使用微调器控件,使用户可以删除任何列表元素。 我有一个“添加”按钮向列表中添加元素,还有一个“删除”按钮从列表中删除当前显示的项目

除用户删除列表中的最后一项外,它的工作方式与预期一致。此时,列表中的所有项目都将被删除

我的代码如下:

    @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
        }
    });
}
@覆盖
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//抓取我们的UI元素,以便我们可以操作它们(用于微调器)
//或向其添加侦听器(对于按钮)
m_mydynamicspiner=(微调器)findviewbyd(R.id.dynamicspiner);
m_addItemText=(EditText)findViewById(R.id.newSpinnerItemText);
Button addButton=(Button)findViewById(R.id.AddBtn);
按钮clearButton=(按钮)findViewById(R.id.ClearBtn);
//创建阵列适配器并将其指定给微调器
m_adapterForSpinner=新的ArrayAdapter(这是android.R.layout.simple_微调器项);
((ArrayAdapter)m_adapterForSpinner).setDropDownViewResource(android.R.layout.simple_spinner_dropdown_项目);
m_mydynamiccspinner.setAdapter(m_adapterForSpinner);
//为addButton添加侦听器
setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
addNewSpinnerItem();
}
});
setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
clearSpinnerItems();
}
});
}
//为addButton添加侦听器
私有void addNewSpinnerItem(){
if(m_addItemText.getText().length()=0){
Toast.makeText(getApplicationContext(),“文本视图为空”,Toast.LENGTH_LONG.show();
}否则{
CharSequence textHolder=”“+m_addItemText.getText();
((ArrayAdapter)m_adapterForSpinner)。添加(textHolder);
}
m_addItemText.setText(“”);
}
私有void clearpinneritems(){
m_mydynamiccspinner.setOnItemSelectedListener(新的OnItemSelectedListener(){
@凌驾
已选择公共位置(AdapterView父项、视图、整数位置、长id){
对象t=m_适配器forspinner.getItem(pos);
((ArrayAdapter)m_适配器或旋转器)。移除((CharSequence)t);
}
@凌驾
未选择公共无效(AdapterView arg0){
//待办事项
}
});
}

是否有人对如何进行此操作有任何想法或建议?

我无法理解您的问题。您可以通过使用getSelectedItemPosition()方法获取所选项目的位置。

您的代码的问题是删除在所选回调中,每次删除条目时都会调用它,从而递归删除,直到您实际上没有更多的条目可供选择为止。如果在该方法中添加日志:

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
公共类SpinnerTest扩展活动{
微调器m_MyDynamics内;
EditText m_addItemText;
阵列适配m_适配器;

public static boolean cleared=false;//您在spinner中是否有setSingleChoiceItems或setMultiChoiceItems?并且,您能否提供一些代码,以便我们以更好的方式帮助您在Log.v(“Item removed”,t+”)中得到什么响应?使用Log.v(“Item removed,t+”);我获取了所选项目,但无法删除所选项目。我使用android.R.layout.simple_微调器\u下拉项目和android.R.layout.simple_微调器_item@shruti...just在ClearPinnerItem m_myDynamicSpinner.removeViewAt(m_myDynamicSpinner.getSelectedItemPosition())中尝试以下代码;并将侦听器代码从方法中删除。这是正确的,在删除一个项后,微调器选择一个新项并调用自己,直到没有剩余项为止。Xou不应该注册onitemselect侦听器,而是选择要删除的项,然后单击Button@2red13是的,我也会这么做,但我假设这是一个测试case是一个我没有看到的代码,因此我给出的解决方案对结构的更改最小。事实上,这种方法还有第二个问题:您无法删除已选中的选项(因为它没有被选中).@Shrey我很高兴它能为你工作。只要确保通知中也有我在上面对2red13的评论中提到的问题。@Aleadam:这段代码不能在列表视图中工作,在单击“删除”按钮时删除项目吗???