Как я могу использовать spinner setOnItemLongClickListener



Я пытаюсь заставить спиннер вести себя по-другому, когда пользователь нажимал на элемент в течение длительного времени. У меня есть спиннер с каким-то проектом, и я хочу две вещи.




  1. Когда пользователь просто нажимает на элемент, который я хочу нормально выбрать.

  2. Когда пользователь долго нажимал на элемент, я хочу показать диалоговое окно с такими опциями, как" редактировать элемент","удалить элемент".


Первый шаг работает хорошо (конечно), но когда я пытаюсь выполнить вторую задачу, я не могу заставить спиннер генерировать событие 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;
}

});
527   4  

4 ответов:

В настоящее время Spinner не поддерживает OnItemLongClickListener.

Однако вы можете добавить 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

    Ничего не найдено.