Android系统自带的spinner不是太好看,有时候需要我们自己去改变它的样子,需要自定义spinner:
首先主界面的样子main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#ffffff"
android:orientation="horizontal" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:text="地点名字 :"
android:textColor="#000000"
android:textSize="20dp" />
<com.spinner.test.CustomerSpinner
android:id="@+id/spinner"
android:layout_width="150dp"
android:layout_height="50dp"
android:layout_marginTop="15dp"
android:background="@drawable/bg_spinner" />
</LinearLayout>
spinner.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="fill_parent"
android:background="@android:color/background_light"
android:orientation="vertical"
android:padding="0.0dip" >
<LinearLayout
android:id="@+id/title"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#defafd"
android:padding="10.0dip" >
<ImageView
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="10.0dip"
/>
<TextView
android:id="@+id/place"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/icon"
android:text="请选择地点:"
android:textColor="#0182af"
android:textSize="20.0dip" />
</LinearLayout>
<ListView
android:id="@+id/list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
android:cacheColorHint="@null"
android:divider="@android:drawable/divider_horizontal_bright"
android:scrollbars="none" />
</LinearLayout>
spinner的item的样子:
item.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="fill_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/tv_item"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:layout_marginLeft="25dp"
android:gravity="center_vertical"
android:textColor="#000000"
android:textSize="16dp" />
</LinearLayout>
接下来就是各自的class:
首先要重写spinner,继承spinner
import java.util.ArrayList;
import android.app.Dialog;
import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.Spinner;
public class MySpinner extends Spinner implements OnItemClickListener {
public static Dialog dialog = null;
private ArrayList<String> list;//ArrayList<String> list存储所要显示的数据
public static String text;
public CustomerSpinner(Context context, AttributeSet attrs) {
super(context, attrs);
}
//如果视图定义了OnClickListener监听器,调用此方法来执行
@Override
public boolean performClick() {
Context context = getContext();
final LayoutInflater inflater = LayoutInflater.from(getContext());
final View view = inflater.inflate(R.layout.spinner, null);
final ListView listview = (ListView) view
.findViewById(R.id.list);
ListviewAdapter adapters = new ListviewAdapter(context, getList());
listview.setAdapter(adapters);
listview.setOnItemClickListener(this);
dialog = new Dialog(context, R.style.dialog);//创建Dialog并设置样式主题
LayoutParams params = new LayoutParams(600, LayoutParams.FILL_PARENT);
dialog.setCanceledOnTouchOutside(true);// 设置点击Dialog外部任意区域关闭Dialog
dialog.show();
dialog.addContentView(view, params);
return true;
}
@Override
public void onItemClick(AdapterView<?> view, View itemView, int position,
long id) {
setSelection(position);
setText(list.get(position));
if (dialog != null) {
dialog.dismiss();
dialog = null;
}
}
public ArrayList<String> getList() {
return list;
}
public void setList(ArrayList<String> list) {
this.list = list;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}
接下来是adapter
import java.util.ArrayList;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
public class ListviewAdapter extends BaseAdapter {
private Context context;
private ArrayList<String> list;
public ListviewAdapter(Context context,ArrayList<String> list){
this.context = context;
this.list = list;
}
@Override
public int getCount() {
return list.size()>0?list.size():0;
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
convertView = LayoutInflater.from(context).inflate(R.layout.item, null);
TextView textView = (TextView)convertView.findViewById(R.id.tv_item);
textView.setText(list.get(position));
return convertView;
}
}
最后是main
import java.util.ArrayList;
import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.widget.ArrayAdapter;
public class SpinnerTestMainActivity extends Activity {
public static ArrayList<String> list = new ArrayList<String>();
private ArrayAdapter<String> adapter;
private MySpinner spinner;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
list.add("北京");
list.add("上海");
list.add("天津");
list.add("广州");
list.add("深圳");
list.add("石家庄");
list.add("太原");
list.add("西安");
list.add("长沙");
spinner = (MySpinner)findViewById(R.id.spinner);
spinner.setList(list);
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, list);
spinner.setAdapter(adapter);
}
}
OK这样就可以了