我需要添加使用上下文菜单或对话框编辑微调器项目的功能,当用户长按项目时,该菜单或对话框应该出现
在这个问题中,我看到有人试图使用
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)通过扩展微调器创建自定义微调器类
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);
}