问题
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