Вопрос по listener, android, spinner – установить onClickListener для вращающегося элемента?

20

У меня есть счетчик, который заполняет из базы данных:

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...).
После добавления новой категории я хочу этот & quot; элемент (Add new category...) & Quot; снова был последним.
Как я могу это сделать?

Ваш Ответ

2   ответа
5

Подцепите OnItemClickListener от Spinner. Затем проверьте, является ли выбранный элемент «Добавить новую категорию».

Если да, покажите диалоговое окно для добавления нового элемента.

При добавлении нового элемента,

  1. Remove the last item "Add new category".
  2. Add the new category entered.
  3. Then Add the item "Add new category" again.

Это заставит & quot; Добавить новую категорию & quot; пункт как последний.

Пример кода:

макет 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);
}

}
Я обновил сообщение с примером кода. Пожалуйста, проверьте.
onitemclicklistener не может быть подключен к счетчику
70

ВыSHOULD NOT вызовOnItemClickListener на вертушке. Spinner не поддерживает события щелчка предмета. Вызов этого метода вызовет исключение. Проверьтеэтот.

Вы можете подать заявку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) 
        {

        }           
    });

Что касается добавления & quot; Добавить новую категорию & quot; Что касается конца списка, думаю, вам лучше перейти к пользовательскому адаптеру, в котором после добавления всех ваших элементов вы можете добавить эту константу (& quot; Добавить новую категорию & quot;) в конец массива, чтобы он всегда был последним ,

Он вернет конкретный объект в этой позиции и преобразует его в строку. Это не вернет позицию. Для идентификатора позиции или элемента используется метод parent.getItemIdAtPosition (position)
Это не работает. Я думаю, потому что этоparent.getItemAtPosition(position).toString(); вернуть позицию и преобразовать ее в строку. Volodymyr Khodonovych
Вы правы, это вернуть объект, но не значение Volodymyr Khodonovych
Я знаю это. Но как я могу справиться сOnItemSelectedListener выбрал только один предмет? Volodymyr Khodonovych
когда вы выбираете какой-либо элемент, вы получите, какой элемент выбран. Сравните этот выбранный элемент с вашим предопределенным элементом, так как он постоянный. Если выбранный элемент является этим предопределенным элементом, сделайте свою задачу

Похожие вопросы