Android spinner item long click/touch

给你一囗甜甜゛ 提交于 2020-03-04 07:39:13

问题


I have in my application spinner. I want to detect long click/touch on its items. I tried this:

    ipSpinner.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {

        public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
            System.out.println("long click on position: " + arg2);
            return true;
        }
    });

But this code doesn't work and I don't know why.

I need to detect long click because I want to enable to delete each items of spinner. Is there another smart way to delete items?


回答1:


Spinner does not yet support Long Click as indicated by Jason Robinson.




回答2:


1) Create a custom spinner class by extending 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();
    }
} 

Use the above spinner in your xml view.

2) Define an interface to handle clicks,

 public interface ClickListener {
        void onItemLongClicked(View view);
        void onItemClicked(View view);
    }

3) In your spinner adapter class do these stuffs in getView and 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) While instantiating the adapter, pass the ClcikListener interface we created.

5) and in the implementing class do the following,

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


来源:https://stackoverflow.com/questions/10050579/android-spinner-item-long-click-touch

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!