在开发中我常常会需要一个下拉选择列表的使用,而这就是Spinner。为啥实现不同的显示效果,我们就需要为Spinner适配自定义的Adapter。
实体
public class ReceiveAddr {
private String addr_desc;
public String getAddr_desc() {
return addr_desc;
}
public void setAddr_desc(String addr_desc) {
this.addr_desc = addr_desc;
}
}
XML:
<Spinner
android:id="@+id/spinner_street"
android:layout_width="match_parent"
android:spinnerMode="dropdown"//显示方式为下拉框型式,也可设置dialog弹窗
android:layout_height="match_parent"
android:paddingLeft="20px"
android:paddingRight="20px"
android:popupBackground="#f0000000"
android:background="@null"/>
Adapter:
public class SpinnerAdapter extends BaseAdapter {
private final Context mContext;
private List<ReceiveAddr> mList;
private int mPosition;
private class ViewHolder{
public TextView mText;
}
public SpinnerAdapter(Context context) {
mContext = context;
}
//传入列表数据
public void update(List<ReceiveAddr> list){
mList = list;
notifyDataSetChanged();
}
//记录选中项,用于高亮显示判断
public void setSelectPosition(int position) {
mPosition = position;
notifyDataSetChanged();
}
@Override
public int getCount() {
return mList== null ? 10 : mList.size();
}
@Override
public ReceiveAddr getItem(int position) {
return mList== null ? null : mList.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
convertView = LayoutInflater.from(mContext).inflate(R.layout.list_item, parent, false);
holder = new ViewHolder();
holder.mText = (TextView) convertView.findViewById(R.id.text);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
ReceiveAddr info = getItem(position);
if (info == null){
holder.mText.setText("请选择");
} else {
holder.mText.setText(info.getAddr_desc());
}
holder.mText.setTextColor(mPosition == position ? Color.parseColor("#fe6c00") : mContext.getResources().getColor(R.color.text_black));
return convertView;
}
}
Activity;
adapter = new SpinnerAdapter(this);
adapter.update(list);
mSpinner.setAdapter(adapter);
mSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
adapter.setSelectPosition(position);
}
//没有选中时的处理
public void onNothingSelected(AdapterView<?> parent) {
}
});
可以通过Spinner的 setSelection(int position) 或者setSelection(int position, boolean animate)来设置初始选中项 ,不设置则默认选中第一项。
这样坐下来我们会发现一个问题,那就是Spinner控件的显示和下拉框中显示的选择项会显示相同的效果,我们要怎么才能让Spinner正常显示,列表中显示选中效果呢。
很简单,我们在XML中将Spinner设置为 android:visibility="invisible",然后在在其上覆盖一个TextView用于显示选中结果就可以了。
因为Spinner为我们提供了一个 performClick()方法,通过该方法我们可以手动的调起Spinner的点击事件。