Android 为微调项设置 onClickListener?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/12108893/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-20 09:45:39  来源:igfitidea点击:

set onClickListener for spinner item?

androidspinnerlistener

提问by Volodymyr

I have spinner which populates from database:

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

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);

And I want to call AlertDialogwhen I select last item(Add new category...).
After I added new category I want that "item(Add new category...)" was the last again.
How I can do this?

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

回答by Braj

You SHOULD NOTcall OnItemClickListeneron a spinner. A Spinner does not support item click events. Calling this method will raise an Exception. Check this.

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

You can apply OnItemSelectedListenerinstead.

你可以申请OnItemSelectedListener代替。

Edit :

编辑 :

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) 
    {

    }           
});

As far as adding "Add new category" to the end of the list is concerned, I think you should better go for custom adapter in which after adding all your items, you can add that constant ("Add new category") to end of array so that it should come last always.

就在列表末尾添加“添加新类别”而言,我认为您最好选择自定义适配器,在添加所有项目后,您可以将该常量(“添加新类别”)添加到末尾数组,以便它应该始终排在最后。

回答by Eldhose M Babu

Hook to OnItemClickListener of Spinner. Then check whether the selected item is "Add new category".

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

If yes, show the dialog to add the new item.

如果是,则显示对话框以添加新项目。

While adding the new item,

在添加新项目时,

  1. Remove the last item "Add new category".
  2. Add the new category entered.
  3. Then Add the item "Add new category" again.
  1. 删除最后一项“添加新类别”。
  2. 添加输入的新类别。
  3. 然后再次添加项目“添加新类别”。

This will make the "Add new category" item as last one.

这将使“添加新类别”项目成为最后一项。

Code Sample :

代码示例:

layout main.xml :

布局 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>

layout spinner_item.xml

布局 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>

Activity class :

活动类:

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);
}

}