最近遇到的一个问题,有时候我们希望下拉列表的某几项是不可选择的。于是和一起的实习生讨论了一下最好找了一个比较简便的方式实现了这个效果。
1.效果图
以上为效果图,灰色的选项无法点击。(各位看官请推荐一个简洁的录视频小软件)
2.自定义适配器
在自定义适配器中实现了主要功能
public class BankAdapter extends BaseAdapter {
private Context context;
private List> list;
public BankAdapter(Context context,List> list){
this.context=context;
this.list=list;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return list.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
View view;
ViewHolder viewHolder;
if(convertView==null){
view=View.inflate(context, R.layout.bank_item, null);
viewHolder=new ViewHolder();
viewHolder.tv_bankname=(TextView)view.findViewById(R.id.tv_bankname);
view.setTag(viewHolder);
}else{
view=convertView;
viewHolder=(ViewHolder)view.getTag();
}
viewHolder.tv_bankname.setText(list.get(position).get("bankname"));
return view;
}
@Override
public View getDropDownView(int position,View convertView,ViewGroup parent){
View view;
ViewDropHolder viewDropHolder;
if(convertView==null){
view=View.inflate(context, R.layout.bank_dropdown_item, null);
viewDropHolder=new ViewDropHolder();
viewDropHolder.ll_drop_bankname=(LinearLayout)view.findViewById(R.id.ll_drop_bankname);
viewDropHolder.tv_drop_bankname=(TextView)view.findViewById(R.id.tv_drop_bankname);
view.setTag(viewDropHolder);
}else{
view=convertView;
viewDropHolder=(ViewDropHolder)view.getTag();
}
//为下拉列表中的每项设置文字内容,不设置话点击下拉列表显示不出字
viewDropHolder.tv_drop_bankname.setText(list.get(position).get("bankname"));
/**
* 标志位,0不可以点击,1可以点击
*/
String isClickable=list.get(position).get("isclickable");
if(isClickable.equals("0")){
//为0 该项不可以点击,显示为灰色
viewDropHolder.tv_drop_bankname.setTextColor(Color.GRAY);
viewDropHolder.ll_drop_bankname.setClickable(true);
viewDropHolder.tv_drop_bankname.setClickable(true);
}else{
//为1 该项可以点击,显示为黑色
viewDropHolder.tv_drop_bankname.setTextColor(Color.BLACK);
viewDropHolder.ll_drop_bankname.setClickable(false);
viewDropHolder.tv_drop_bankname.setClickable(false);
}
return view;
}
class ViewHolder{
TextView tv_bankname;
}
class ViewDropHolder{
LinearLayout ll_drop_bankname;
TextView tv_drop_bankname;
}
}
Spinner通常要设置两个布局,一个是布局决定是Spinner的风格,一个布局决定是点击Spinner显示出的下拉列表的风格。而在以上的代码中 getView方法返回的View就是用来显示Spinner的一个item,即Spinner的风格;而getDropDownView则返回下拉列表中的item,即Spinner下拉列表的风格。如果不重写getDropDownView方法,getDropDownView默认的返回值是getView的返回值。不能选择的项把布局中的TextView和LinearLayout设置为可点击的,反之设置为不可点击,可点击时点击事件被TexView和LinearLayou截获,导致了选择item无效。这里的布局文件都非常简单,都是线性布局中含有一个TextView,就不在这里贴出代码了。
3.主程序
package com.example.spinnertest;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.os.Bundle;
import android.app.Activity;
import android.widget.Spinner;
public class MainActivity extends Activity {
private Spinner sp_bank_list;
private List> list=new ArrayList>();
private String b="我的第";
private String c="银行卡";
private BankAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
setData();
}
public void initView(){
sp_bank_list=(Spinner)findViewById(R.id.sp_bank_list);
}
public void setData(){
for(int i=1;i<11;i++){
HashMap map=new HashMap();
map.put("bankname", b+Integer.toString(i)+c);
//0为银行卡不可选择;1为可选择
if(10%i>2){
map.put("isclickable", "0");
}else{
map.put("isclickable", "1");
}
list.add(map);
}
adapter=new BankAdapter(MainActivity.this, list);
sp_bank_list.setAdapter(adapter);
}
}
主程序也很简单,注意一定要有个标志位。
刚学Android的没多久,如果程序有什么可以改进的地方,还请大家留言告诉我,小弟不胜感激!
下面是源码下载地址:
源码点我