一个简单的安卓spinner控件自绘。外观可行,但实用性不怎么样。
控件分为两个部分:一个textview和一个popupwindow
textview自定义边框形状、边线,并在右边添加“﹀“”︿”图像,单击textview时弹出popupwindow
代码:
主活动中:
public class MainActivity extends Activity { private SpinerPopWindow<String> mSpinerPopWindow; private List<String> list = new ArrayList<String>(); private TextView tvValue; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); list.add("test1:"); list.add("test2:"); list.add("test3:"); list.add("test4:"); list.add("test5:"); list.add("test6:"); tvValue = (TextView) findViewById(R.id.tv_value); //显示PopupWindow tvValue.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { switch (v.getId()) { case R.id.tv_value: mSpinerPopWindow.setWidth(tvValue.getWidth()); mSpinerPopWindow.showAsDropDown(tvValue); setTextImage(R.drawable.icon_up); break; } } }); //popupwindow显示的ListView的item点击事件 mSpinerPopWindow = new SpinerPopWindow<String>(this, list,new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position,long id) { mSpinerPopWindow.dismiss(); tvValue.setText(list.get(position)); } }); //监听popupwindow取消 mSpinerPopWindow.setOnDismissListener(new OnDismissListener() { @Override public void onDismiss() { setTextImage(R.drawable.icon_down); } }); } //设置右端图像 private void setTextImage(int resId) { Drawable drawable = getResources().getDrawable(resId); drawable.setBounds(0, 0, drawable.getMinimumWidth(),drawable.getMinimumHeight());// 必须设置图片大小,否则不显示 tvValue.setCompoundDrawables(null, null, drawable, null); } }
PopupWindow代码:
@SuppressWarnings("unused") @SuppressLint("InflateParams") public class SpinerPopWindow<T> extends PopupWindow { private LayoutInflater inflater; private ListView mListView; private List<T> list; private MyAdapter mAdapter; public SpinerPopWindow(Context context,List<T> list,OnItemClickListener clickListener) { super(context); inflater=LayoutInflater.from(context); this.list=list; init(clickListener); } private void init(OnItemClickListener clickListener) { View view = inflater.inflate(R.layout.spiner_window_layout, null); setContentView(view); setWidth(LayoutParams.WRAP_CONTENT); setHeight(LayoutParams.WRAP_CONTENT); setFocusable(true); ColorDrawable dw = new ColorDrawable(0x00); setBackgroundDrawable(dw); mListView = (ListView) view.findViewById(R.id.listview); mListView.setAdapter(mAdapter=new MyAdapter()); mListView.setOnItemClickListener(clickListener); } private class MyAdapter extends BaseAdapter { @Override public int getCount() { return list.size(); } @Override public Object getItem(int position) { return list.get(position); } @Override public long getItemId(int position) { return position; } @SuppressWarnings("unchecked") @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder=null; if(convertView==null) { holder=new ViewHolder(); convertView=inflater.inflate(R.layout.spiner_item_layout, null); holder.tvName=(TextView) convertView.findViewById(R.id.tv_name); convertView.setTag(holder); } else { holder=(ViewHolder) convertView.getTag(); } holder.tvName.setText(getItem(position).toString()); return convertView; } } private class ViewHolder { private TextView tvName; } } shape_list.xml <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <!-- This is the main color --> <item> <shape> <!-- 边框颜色 --> <solid android:color="#71C297"/> </shape> </item> <!-- 给View的上 左 右设置8dp的边框 --> <item android:left="1dp" android:right="1dp" android:bottom="1dp"> <shape> <!-- View填充颜色 --> <solid android:color="#FFFFFFFF"/> </shape> </item> </layer-list> shape_tv.xml <shape xmlns:android="http://schemas.android.com/apk/res/android" > <!-- 填充的颜色 --> <solid android:color="#FFFFFFFF" /> <corners android:topLeftRadius="5dp" android:topRightRadius="5dp" /> <!-- 设置边框 --> <stroke android:width="1dp" android:color="#71C297" /> </shape> spiner_window_layout.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:orientation="vertical"> <ListView android:id="@+id/listview" android:layout_width="fill_parent" android:layout_height="wrap_content" android:cacheColorHint="#00000000" android:background="@drawable/shape_list" android:scrollbars="none" > </ListView> </LinearLayout> spiner_item_layout.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center_vertical"> <TextView android:id="@+id/tv_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10dp" android:textColor="#666666" android:textSize="20sp"/> </LinearLayout> actity_main.xml <TextView android:id="@+id/tv_value" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:layout_marginRight="20dp" android:background="@drawable/shape_tv"//可以设置背景图片 android:drawableRight="@drawable/icon_down" android:padding="10dp" android:text="请选择父类别" android:textColor="#666666" android:textSize="20sp" />