如何使用微调器setOnItemLongClickListener

时间:2010-04-28 14:59:50

标签: android spinner

当用户长时间点击某个项目时,我试图使Spinner的行为方式不同。我有一些项目的旋转器,我想要两件事。

  1. 当用户只需点击我想要正常的项目时,选择它。
  2. 当用户长时间点击我要显示对话框的项目时,会显示“编辑项目”,“删除项目”等选项。
  3. 第一步效果很好(当然),但是当我尝试执行第二项任务时,我无法使微调器生成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 个答案:

答案 0 :(得分:15)

Spinner目前不支持OnItemLongClickListener

答案 1 :(得分:7)

您可以将OnLongClickListener添加到Spinner中。当菜单上的项目被长时间点击时,它不会被触发,但是当用户长时间点击微调器时,它将被触发。

this.projectSpinner.setOnLongClickListener(new OnLongClickListener() 
{
    @Override
    public boolean onLongClick(View v) 
    {
        System.out.println(chuteSpinner.getSelectedItem().toString() + " is long clicked");
        return true;
    }
});

答案 2 :(得分:1)

1)通过扩展微调器

来创建自定义微调器类
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)在你的微调器适配器类中,在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);
    }

答案 3 :(得分:0)

只需使用带处理程序的touchlistener。获取所选项目

spinner.getSelectedItemPosition