Подтвердить что ты не робот

Установить onClickListener для элемента spinner?

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

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...)" был последним.
Как я могу это сделать?

4b9b3361

Ответ 1

Вы НЕ ДОЛЖНЫ вызывать OnItemClickListener для счетчика. Spinner не поддерживает события щелчка элемента. Вызов этого метода вызовет исключение. Проверьте этот. Вместо этого вы можете применить 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) 
        {

        }           
    });

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

Ответ 2

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

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

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

  • Удалить последний элемент "Добавить новую категорию".
  • Добавить введенную новую категорию.
  • Затем снова добавьте элемент "Добавить новую категорию".

Это сделает элемент "Добавить новую категорию" последним.

Пример кода:

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>

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

}