自定义Combobox

publicclassComboboxextendsTextView{privateContextcontext;privateDialogmDialog;privateList<String>mItems;privateStringtitle;privateTextViewtitleText;privateList<CodenamePair>pairs;privatebooleanisMultipleChoice;privateHashMap<Integer,String>choiceItemsMap;privatebooleanargIsList;privateintposition=-1;privateList<Integer>posList;privateCboxDialogArrayAdapteradapter;publicvoidsetDialogItems(ArrayList<String>mItems){this.mItems=mItems;argIsList=false;}publicvoidsetDialogItems(String[]mItems){this.mItems=Arrays.asList(mItems);argIsList=false;}publicvoidsetDialogItems(List<CodenamePair>cnPairs){this.pairs=cnPairs;List<String>items=null;argIsList=true;if(cnPairs!=null){intlen=cnPairs.size();items=newArrayList<String>();for(inti=0;i<len;i++){items.add(cnPairs.get(i).getName());}}this.mItems=items;}publicCombobox(Contextcontext,ArrayList<String>items){super(context);init(context,null);this.mItems=items;}publicCombobox(Contextcontext,AttributeSetattrs){super(context,attrs);init(context,attrs);}privatevoidinit(Contextcontext,AttributeSetattrs){this.isMultipleChoice=context.obtainStyledAttributes(attrs,R.styleable.Combobox).getBoolean(R.styleable.Combobox_isMultipleChoice,false);this.context=(context==null?getContext():context);this.setBackgroundResource(android.R.drawable.editbox_background_normal);//Combobox的向下的图标Drawabledrawable=getResources().getDrawable(R.drawable.dropdown);drawable.setBounds(0,0,drawable.getMinimumWidth(),drawable.getMinimumHeight());this.setCompoundDrawables(null,null,drawable,null);this.setOnClickListener(clickListener);titleText=(TextView)LayoutInflater.from(context).inflate(R.layout.layout_combobox_dialog_title,null);}OnClickListenerclickListener=newOnClickListener(){@OverridepublicvoidonClick(Viewv){if(choiceItemsMap==null)choiceItemsMap=newHashMap<Integer,String>();showDialog();}};List<Integer>selPostion=newArrayList<Integer>();privatebooleanshowDialog(){selPostion.clear();if(position>=0){selPostion.add(position);}elseif(posList!=null&&posList.size()>0){selPostion.addAll(posList);}if(mDialog==null){mDialog=createDialog();if(mDialog==null){returnfalse;}}if(posList==null)posList=newArrayList<Integer>();mDialog.show();if(mItems.size()>5){mDialog.getWindow().setLayout(mDialog.getWindow().getAttributes().width,500);}else{mDialog.getWindow().setLayout(mDialog.getWindow().getAttributes().width,WindowManager.LayoutParams.WRAP_CONTENT);}returntrue;}privateDialogcreateDialog(){if(mItems==null){returnnull;}AlertDialog.Builderbuilder=newAlertDialog.Builder(context);builder.setTitle(title);adapter=newCboxDialogArrayAdapter(context,mItems,selPostion,isMultipleChoice);builder.setAdapter(adapter,itemClickListener);builder.setCancelable(true);AlertDialogdialog=builder.create();dialog.setCustomTitle(titleText);if(isMultipleChoice){dialog.setButton(DialogInterface.BUTTON_POSITIVE,context.getString(R.string.combobox_button_positive),newDialogInterface.OnClickListener(){@OverridepublicvoidonClick(DialogInterfacedialog,intwhich){StringBuffertext=newStringBuffer();if(choiceItemsMap!=null&&choiceItemsMap.size()>0){Iterator<String>iterator=choiceItemsMap.values().iterator();while(iterator.hasNext()){if(text.length()!=0)text.append(",");text.append(iterator.next());}}setText(text);setAutoCloseDialog(dialog,true);dialog.cancel();}});dialog.setButton(DialogInterface.BUTTON_NEGATIVE,context.getString(R.string.combobox_button_negative),newDialogInterface.OnClickListener(){@OverridepublicvoidonClick(DialogInterfacedialog,intwhich){setAutoCloseDialog(dialog,true);dialog.cancel();}});}returndialog;}privateDialogInterface.OnClickListeneritemClickListener=newDialogInterface.OnClickListener(){@OverridepublicvoidonClick(DialogInterfacedialog,intpos){setAutoCloseDialog(dialog,false);Stringcontent=mItems.get(pos);CheckedTextViewtextView=(CheckedTextView)adapter.getItem(pos);if(isMultipleChoice){booleanisChecked=!posList.contains(newInteger(pos));if(isChecked&&!choiceItemsMap.containsKey(pos)){choiceItemsMap.put(pos,content);posList.add(pos);textView.setChecked(true);}elseif(choiceItemsMap.containsKey(pos)){choiceItemsMap.remove(pos);posList.remove(newInteger(pos));textView.setChecked(false);}}else{textView.setChecked(true);position=pos;setText(content);setAutoCloseDialog(dialog,true);dialog.cancel();}}};privatevoidsetAutoCloseDialog(DialogInterfacedialog,booleanisClose){try{Fieldfield=dialog.getClass().getSuperclass().getDeclaredField("mShowing");field.setAccessible(true);field.set(dialog,isClose);((AlertDialog)dialog).setCancelable(true);}catch(NoSuchFieldExceptione){Log.e("NoSuchFieldException",e.getMessage());}catch(IllegalAccessExceptione){Log.e("IllegalAccessException",e.getMessage());}}publicList<CodenamePair>getSelectedItems(){if(!isMultipleChoice)returnnull;List<CodenamePair>selList=newArrayList<CodenamePair>();if(argIsList&&posList!=null){for(inti=0;i<posList.size();i++){selList.add(pairs.get(posList.get(i)));}}else{if(choiceItemsMap!=null){Iterator<String>iterator=choiceItemsMap.values().iterator();CodenamePairpair=null;while(iterator.hasNext()){pair=newCodenamePair();pair.setName(iterator.next());selList.add(pair);}}}returnselList;}publicvoidsetSelectedItems(List<CodenamePair>selItems){if((selItems==null||selItems.size()<=0)||!isMultipleChoice||(mItems==null&&pairs==null))return;if(choiceItemsMap==null)choiceItemsMap=newHashMap<Integer,String>();intsize=argIsList?pairs.size():mItems.size();for(inti=0;i<size;i++){Stringcode=null;Stringname=null;if(argIsList){code=pairs.get(i).getCode();name=pairs.get(i).getName();}else{name=mItems.get(i);}for(CodenamePairpair:selItems){if((StringUtil.isNotBlank(code)&&code.equals(pair.getCode()))||(!StringUtil.isNotBlank(pair.getCode())&&name.equals(pair.getName()))){if(posList==null)posList=newArrayList<Integer>();posList.add(newInteger(i));choiceItemsMap.put(newInteger(i),name);}}}if(posList!=null&&posList.size()>0){StringBuffertext=newStringBuffer();Iterator<String>iterator=choiceItemsMap.values().iterator();while(iterator.hasNext()){if(text.length()!=0)text.append(",");text.append(iterator.next());}setText(text);}}publicCodenamePairgetSelectedItem(){if(isMultipleChoice||position<0)returnnull;CodenamePairpair=null;if(argIsList){pair=pairs.get(position);}else{pair=newCodenamePair();pair.setName(mItems.get(position));}returnpair;}publicvoidsetSelectedItem(CodenamePairpair){if(pair==null||isMultipleChoice||(mItems==null&&pairs==null))return;intsize=argIsList?pairs.size():mItems.size();for(inti=0;i<size;i++){Stringcode=null;Stringname=null;if(argIsList&&pairs!=null){CodenamePaircnPair=pairs.get(i);code=cnPair.getCode();name=cnPair.getName();}elseif(mItems!=null){name=mItems.get(i);}if(StringUtil.isNotBlank(code)&&code.equals(pair.getCode())){position=i;setText(name);break;}elseif(!StringUtil.isNotBlank(pair.getCode())&&name.equals(pair.getName())){position=i;setText(name);break;}}}publicStringgetTitle(){returntitle;}publicvoidsetTitle(Stringtitle){if(titleText!=null){titleText.setText(title);}this.title=title;}publicvoidclear(){position=-1;if(posList!=null)posList.clear();if(choiceItemsMap!=null)choiceItemsMap.clear();setText(null);}}

CodenamePair类

publicclassCodenamePair{privateStringcode;privateStringname;publicCodenamePair(){disStatus=2;extraData=newHashMap<String,String>();}publicCodenamePair(Stringcode,Stringname){disStatus=2;extraData=newHashMap<String,String>();this.code=code;this.name=name;}publicStringgetCode(){returncode;}publicStringsetCode(Stringcode){returnthis.code=code;}publicStringgetName(){returnname;}publicStringsetName(Stringname){returnthis.name=name;}}

attrs.xml文件,定义isMultipleChoice属性,Combobox是否多选

<declare-styleablename="Combobox"><attrname="isMultipleChoice"format="boolean"></attr></declare-styleable>

Combobox Item 的样式文件 layout_combobox_dialog_item.xml

<?xmlversion="1.0"encoding="utf-8"?><RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"><CheckedTextViewandroid:visibility="gone"android:id="@+id/combobox_dialog_item_radioButton"android:layout_width="match_parent"android:layout_height="wrap_content"android:minHeight="?android:attr/listPreferredItemHeight"android:textAppearance="?android:attr/textAppearanceMedium"android:textColor="?android:attr/textColorAlertDialogListItem"android:gravity="center_vertical"android:paddingLeft="18dp"android:paddingEnd="7dp"android:checkMark="?android:attr/listChoiceIndicatorSingle"android:ellipsize="marquee"/><CheckedTextViewandroid:visibility="visible"android:id="@+id/combobox_dialog_item_checkBox"android:layout_width="match_parent"android:layout_height="wrap_content"android:minHeight="?android:attr/listPreferredItemHeight"android:textAppearance="?android:attr/textAppearanceMedium"android:textColor="?android:attr/textColorAlertDialogListItem"android:gravity="center_vertical"android:paddingLeft="18dp"android:paddingEnd="7dp"android:checkMark="?android:attr/listChoiceIndicatorMultiple"android:ellipsize="marquee"/></RelativeLayout>

Combobox tittle 样式文件layout_combobox_dialog_title.xml

<?xmlversion="1.0"encoding="utf-8"?><TextViewxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:paddingBottom="15dp"android:paddingTop="15dp"android:paddingLeft="10dp"android:textColor="@color/black"android:background="@color/gray"android:textAppearance="?android:attr/textAppearanceLarge"android:text="combobox_title_text"android:id="@+id/combobox_title"/>


更多相关文章

  1. android 获取配置文件 相对路径
  2. Android关于读取临时文件
  3. Android下载并打开pdf文件
  4. Android HTTP GET 小文件下载
  5. Android中播放mp3文件
  6. Android 文件的下载
  7. framework之 ContextImpl文件解析
  8. Android外部存储(/storage/emulated/0)无法创建文件夹

随机推荐

  1. 遗传算法与函数优化
  2. 机器学习算法-随机森林(Random Forest)
  3. CSS学习(一)
  4. Linux管理员和普通用户
  5. css元素选择器
  6. 一、简单学习Ajax的GET & POST请求
  7. 干货丨手把手教你如何加载和操作DolphinD
  8. Terraform踩坑记之:Azure Provider配置
  9. 模拟器如何换IP
  10. virt-viewer编译:syntax error near unexp