Как я могу использовать spinner setOnItemLongClickListener
Я пытаюсь заставить спиннер вести себя по-другому, когда пользователь нажимал на элемент в течение длительного времени. У меня есть спиннер с каким-то проектом, и я хочу две вещи.
- Когда пользователь просто нажимает на элемент, который я хочу нормально выбрать.
- Когда пользователь долго нажимал на элемент, я хочу показать диалоговое окно с такими опциями, как" редактировать элемент","удалить элемент".
Первый шаг работает хорошо (конечно), но когда я пытаюсь выполнить вторую задачу, я не могу заставить спиннер генерировать событие longClicked.
Вот мой код:
this.projectSpinner = (Spinner) this.findViewById(R.id.SpinnerProjects);
this.projectSpinner.setLongClickable(true);
this.projectSpinner.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener(){
public boolean onItemLongClick(AdapterView<?> arg0,
View arg1,
int arg2,
long arg3) {
Toast.makeText(
AndroidTimeTrackerMainActivity.this,
"Long click",
Toast.LENGTH_SHORT).show(); // This toast doesn't show up.
return false;
}
});
4 ответов:
Однако вы можете добавить OnLongClickListener к спиннеру. Он не будет срабатывать, когда пункт меню долго нажат, но он будет срабатывать, когда пользователь долго нажимает на сам спиннер.
this.projectSpinner.setOnLongClickListener(new OnLongClickListener() { @Override public boolean onLongClick(View v) { System.out.println(chuteSpinner.getSelectedItem().toString() + " is long clicked"); return true; } });
1) Создайте пользовательский класс spinner, расширив spinner,
public class CCSpinner extends Spinner { public CCSpinner(Context context) { super(context); } public CCSpinner(Context context, int mode) { super(context, mode); } public CCSpinner(Context context, AttributeSet attrs) { super(context, attrs); } public CCSpinner(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } public CCSpinner(Context context, AttributeSet attrs, int defStyleAttr, int mode) { super(context, attrs, defStyleAttr, mode); } @Override public void onDetachedFromWindow() { super.onDetachedFromWindow(); } }Используйте приведенный выше счетчик в своем xml-представлении.
2) Определите интерфейс для обработки кликов,
public interface ClickListener { void onItemLongClicked(View view); void onItemClicked(View view); }3) в вашем классе адаптера spinner выполните эти действия в getView и getDropDownView
@Override public View getView(int position, View convertView, ViewGroup parent) { //ususal stuffs convertView.setTag(R.string.click_tag, position); convertView.setClickable(false); convertView.setLongClickable(false); return convertView; } @Override public View getDropDownView(int position, View convertView, ViewGroup parent) { //ususal stuffs convertView.setTag(R.string.click_tag, position); convertView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (clickListener != null) { clickListener.onItemClicked(v); } } }); convertView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { if (clickListener != null) { clickListener.onItemLongClicked(v); } return true; } }); return convertView; }4) при создании экземпляра адаптера передайте созданный нами интерфейс ClcikListener.
5) и в классе реализации выполните следующие действия,
@Override public void onItemLongClicked(final View view) { mPSpinner.onDetachedFromWindow(); final int pos = (int) view.getTag(R.string.click); mPSpinner.setSelection(pos); } @Override public void onItemClicked(final View view) { mPSpinner.onDetachedFromWindow(); int pos = (int) view.getTag(R.string.click); mPSpinner.setSelection(pos); }
Просто используйте touchlistener с обработчиком. для получения выбранного элемента
spinner.getSelectedItemPosition
Comments