为spinner项设置onClickListener?

时间:2012-08-24 11:50:15

标签: android spinner listener

我有从数据库中填充的微调器:

catSpinner = (Spinner) findViewById(R.id.spinner1);
cursor = dataAdapter.getAllCategory();
startManagingCursor(cursor);
String[] from = new String[] { DataAdapter.CATEGORY_COL_NAME };
int[] to = new int[] { android.R.id.text1 };
SimpleCursorAdapter catAdapter = new SimpleCursorAdapter(this,  
           android.R.layout.simple_spinner_dropdown_item, cursor, from,to, 0);
catAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
catAdapter.notifyDataSetChanged();
catSpinner.setAdapter(catAdapter);

我想在选择最后一项(AlertDialog)时拨打Add new category... 添加新类别后,我希望“item(Add new category...)”再次成为最后一个 我怎么能这样做?

2 个答案:

答案 0 :(得分:72)

不应该在微调器上调用OnItemClickListener。 Spinner不支持项目点击事件。调用此方法将引发异常。检查this

您可以改为申请OnItemSelectedListener

修改:

    spinner.setOnItemSelectedListener(new OnItemSelectedListener() 
    {
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) 
        {
            String selectedItem = parent.getItemAtPosition(position).toString();
            if(selectedItem.equals("Add new category"))
            {
                 // do your stuff
            }
        } // to close the onItemSelected
        public void onNothingSelected(AdapterView<?> parent) 
        {

        }           
    });

就在列表末尾添加“添加新类别”而言,我认为最好选择自定义适配器,在添加所有项目后,可以添加该常量(“添加新类别”)到数组结束,以便它总是最后一次。

答案 1 :(得分:5)

钩到Spinner的OnItemClickListener。然后检查所选项目是否为“添加新类别”。

如果是,请显示添加新项目的对话框。

添加新项目时,

  1. 删除最后一项“添加新类别”。
  2. 添加新输入的类别。
  3. 然后再次添加“添加新类别”项目。
  4. 这将使“添加新类别”项目成为最后一项。

    代码示例:

    layout main.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:weightSum="10" >
    
    <Spinner
        android:id="@+id/cmbNames"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    
    </LinearLayout>
    

    布局spinner_item.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    
    <TextView
        android:id="@+id/tvName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    
    </LinearLayout>
    

    活动类:

    public class MainActivity extends Activity {
    
    private static final String NAME = "name";
    private static final String ADD_NEW_ITEM = "Add New Item";
    
    private SimpleAdapter adapter;
    private Spinner cmbNames;
    private List<HashMap<String, String>> lstNames;
    private int counter;
    
    private OnItemSelectedListener itemSelectedListener = new OnItemSelectedListener() {
    
        @Override
        public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
                long arg3) {
            HashMap<String, String> map = lstNames.get(arg2);
            String name = map.get(NAME);
            if (name.equalsIgnoreCase(ADD_NEW_ITEM)) {
                lstNames.remove(map);
                counter++;
                addNewName(String.valueOf(counter));
                addNewName(ADD_NEW_ITEM);
                adapter.notifyDataSetChanged();
            }
        }
    
        @Override
        public void onNothingSelected(AdapterView<?> arg0) {
            // TODO Auto-generated method stub
    
        }
    };
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    
        populateList();
    
        cmbNames = (Spinner) findViewById(R.id.cmbNames);
        adapter = new SimpleAdapter(this, lstNames, R.layout.spinner_item,
                new String[] { NAME }, new int[] { R.id.tvName });
        cmbNames.setAdapter(adapter);
        cmbNames.setOnItemSelectedListener(itemSelectedListener);
    }
    
    private void populateList() {
        lstNames = new ArrayList<HashMap<String, String>>();
    
        addNewName("abc");
        addNewName("pqr");
        addNewName("xyz");
        addNewName(ADD_NEW_ITEM);
    }
    
    private void addNewName(String name) {
        HashMap<String, String> map = new HashMap<String, String>();
        map.put(NAME, name);
        lstNames.add(map);
    }
    
    }