您的位置:首页 > 运维架构

dropdown模式下可以设置Prompt的Spinner

2015-08-25 23:11 399 查看
今天有一个需求要用到Spinner,

原生Spinner默认显示 集合中的第一条数据,

但需求是 因为第一条是提示语句 所以不想让其显示到下拉列表

Spinner有一种dialog模式,可以设置Prompt

在对话框的标题上就会显示设置的prompt

但是要想在dropdown中用prompt 要做到就很麻烦了

下面就是实现 这种方法的Demo

public class NoDefaultSpinner extends Spinner {

public NoDefaultSpinner(Context context) {

super(context);

}

public NoDefaultSpinner(Context context, AttributeSet attrs) {

super(context, attrs);

}

public NoDefaultSpinner(Context context, AttributeSet attrs, int defStyle) {

super(context, attrs, defStyle);

}

@Override

public void setAdapter(SpinnerAdapter orig ) {

final SpinnerAdapter adapter = newProxy(orig);

super.setAdapter(adapter);

try {

final Method m = AdapterView.class.getDeclaredMethod(

"setNextSelectedPositionInt",int.class);

m.setAccessible(true);

m.invoke(this,-1);

final Method n = AdapterView.class.getDeclaredMethod(

"setSelectedPositionInt",int.class);

n.setAccessible(true);

n.invoke(this,-1);

}

catch( Exception e ) {

throw new RuntimeException(e);

}

}

protected SpinnerAdapter newProxy(SpinnerAdapter obj) {

return (SpinnerAdapter) java.lang.reflect.Proxy.newProxyInstance(

obj.getClass().getClassLoader(),

new Class[]{SpinnerAdapter.class},

new SpinnerAdapterProxy(obj));

}

/**

* Intercepts getView() to display the prompt if position < 0

*/

protected class SpinnerAdapterProxy implements InvocationHandler {

protected SpinnerAdapter obj;

protected Method getView;

protected SpinnerAdapterProxy(SpinnerAdapter obj) {

this.obj = obj;

try {

this.getView = SpinnerAdapter.class.getMethod(

"getView",int.class,View.class,ViewGroup.class);

}

catch( Exception e ) {

throw new RuntimeException(e);

}

}

public Object invoke(Object proxy, Method m, Object[] args) throws Throwable {

try {

return m.equals(getView) &&

(Integer)(args[0])<0 ?

getView((Integer)args[0],(View)args[1],(ViewGroup)args[2]) :

m.invoke(obj, args);

}

catch (InvocationTargetException e) {

throw e.getTargetException();

}

catch (Exception e) {

throw new RuntimeException(e);

}

}

protected View getView(int position, View convertView, ViewGroup parent)

throws IllegalAccessException {

if( position<0 ) {

final TextView v =

(TextView) ((LayoutInflater)getContext().getSystemService(

Context.LAYOUT_INFLATER_SERVICE)).inflate(

android.R.layout.simple_spinner_item,parent,false);

v.setText(getPrompt());

return v;

}

return obj.getView(position,convertView,parent);

}

}

}

通过引用上面代码 就可以在dropdown模式下 设置Prompt了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: