Spinner setOnItemLongClickListener不起作用

时间:2014-10-26 21:32:35

标签: android android-spinner android-contextmenu

我需要使用上下文菜单或用户长按项目时应显示的对话框添加编辑微调器项目的功能

this question我看到有人试图使用

spinner.setOnItemLongClickListener(new OnItemLongClickListener() {

            public boolean onItemLongClick(AdapterView<?> parent, View view, int arg2, long arg3) {

                view.showContextMenu();
                return true;

            }
        });

但这种方法不起作用。

我用

填充Spinner
ArrayAdapter<String> adapter=new ArrayAdapter<String>(this, R.layout.my_spinner_item_layout, itemList); spinner.setAdapter(adapter);

我在另一个问题中看到,只是建议避免尝试为Spinner实现上下文菜单,但我没有太多空间,所以我不能使用ListView而不是丑陋结果,只有在极少数情况下才需要此操作,因此上下文菜单或类似内容似乎是唯一有效的选择。

我如何为Spinner实现上下文菜单或扩展Android Spinner以支持长按Spinner内的项目?

1 个答案:

答案 0 :(得分:0)

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