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:这段代码不能在列表视图中工作,在单击“删除”按钮时删除项目吗???