自定义多选TextView组件
2014-10-29 10:52
211 查看
近期因为项目所需,不能使用spinner组件,所以写了一个自定义多选TextView组件。如下:
思路:监听TextVew的OnClick事件,弹出dialog,记录所选的item,点击确定后 设置textView的text为选中的text,通过接口回调,返回所选的item的code,以逗号间隔
下面再贴上SpinnerStringItem实体类的代码,其中id是String类型,可以根据所需,自己修改
使用该自定义组件时,注意,需要自己设置多选数据源 ,并实现AfterChecked接口,在该接口中,接受自己所选择的item的id
思路:监听TextVew的OnClick事件,弹出dialog,记录所选的item,点击确定后 设置textView的text为选中的text,通过接口回调,返回所选的item的code,以逗号间隔
public class MultipleCheckBoxView extends TextView implements OnClickListener { private Context context; private List<SpinnerStringItem> dataSourceList;//传递进来的数据源 private String selectedCode;// 选中的code private String selectedText;// 选中的 显示文本 private boolean isOpened = false;//用于记录是否触发了文本框的点击事件 private AfterChecked checked;
//回调接口 public interface AfterChecked{ public void checked(String code); } // 记录选中状态 private boolean[] isItemSelected; public MultipleCheckBoxView(Context context) { super(context); this.context = context; this.setOnClickListener(this); } public MultipleCheckBoxView(Context context, AttributeSet attrs) { super(context, attrs, 0); this.context = context; this.setOnClickListener(this); } public MultipleCheckBoxView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); this.context = context; this.setOnClickListener(this); } @Override public void onClick(View v) { isOpened = true; createDialog(); } public void createDialog(){ if(dataSourceList == null){ Toast.makeText(context, "请设置多选数据源!",Toast.LENGTH_SHORT).show(); return; } if(dataSourceList.size() == 0){ return; } final String[] arrayText = new String[dataSourceList.size()] ; final boolean[] arraySelected = new boolean[dataSourceList.size()]; // 第一次打开该组件,初始化记录选中状态的数组 if(isItemSelected == null){ isItemSelected = arraySelected; } for (int i = 0; i < dataSourceList.size(); i++) { arrayText[i] = dataSourceList.get(i).getValue(); // 如果选中过,设置为选中状态 if(i < isItemSelected.length){ arraySelected[i] = isItemSelected[i]; }else{ arraySelected[i] = false; } } Dialog alertDialog = new AlertDialog.Builder(context) .setTitle("请选择") .setMultiChoiceItems(arrayText, arraySelected, new DialogInterface.OnMultiChoiceClickListener() { @Override public void onClick(DialogInterface dialog, int which, boolean isChecked) { arraySelected[which] = isChecked; } }) .setPositiveButton("确认", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { selectedText = ""; selectedCode = ""; // 拼接选中的字符串 for (int i = 0; i < arraySelected.length; i++) { if(arraySelected[i]){ if("".equals(selectedText)){ selectedText += dataSourceList.get(i).getValue(); selectedCode += dataSourceList.get(i).getId(); }else{ selectedText += ","+ dataSourceList.get(i).getValue(); selectedCode += ","+ dataSourceList.get(i).getId(); } } } isOpened = true; // 记录新的选中状态 isItemSelected = arraySelected; // 记录选中的文本 MultipleCheckBoxView.this.setText(selectedText); } }) .setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }).create(); alertDialog.show(); } @Override public void setText(CharSequence text, BufferType type) { super.setText(text, type); if(isOpened && checked !=null){ checked.checked(selectedCode);//调用接口,把选中的item的code返回 } } public List<SpinnerStringItem> getDataSourceList() { return dataSourceList; } public void setDataSourceList(List<SpinnerStringItem> dataSourceList) { this.dataSourceList = dataSourceList; } public String getSelectedCode() { return selectedCode; } public void setSelectedCode(String selectedCode) { this.selectedCode = selectedCode; } public AfterChecked getChecked() { return checked; } public void setChecked(AfterChecked checked) { this.checked = checked; } }
下面再贴上SpinnerStringItem实体类的代码,其中id是String类型,可以根据所需,自己修改
public class SpinnerStringItem { private String id; private String value; public SpinnerStringItem(){ } public SpinnerStringItem(String id, String value){ this.id = id; this.value = value; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } @Override public String toString() { return value; } @Override public boolean equals(Object o) { if(!(o instanceof SpinnerStringItem)){ return false; } SpinnerStringItem temp = (SpinnerStringItem)o; if(this.id == temp.id){ return true; } return false; } }
使用该自定义组件时,注意,需要自己设置多选数据源 ,并实现AfterChecked接口,在该接口中,接受自己所选择的item的id
相关文章推荐
- android listView 自定义布局结合CheckedTextView实现多选
- android listView 自定义布局结合CheckedTextView实现多选
- android自定义本地邮箱联想组件(基于MultiAutoCompleteTextView)
- 新书内容连载(1):自定义Android组件之带图像的TextView
- 自定义Android组件之带图像的TextView
- android 让TextView支持的Html标签实现自定义时钟显示组件DigitalClock
- 【Android进阶】Android自定义组件之自动换行View,以TextView为例
- 自定义Android组件之带图像的TextView(转)
- (转帖)自定义Android组件之带图像的TextView
- Android自定义组件之TextView
- 自定义Android组件之带图像的TextView
- Android TextView 自定义组件 FontAwesome
- android 自定义组件-带图片的textView
- (转)自定义Android组件之带图像的TextView
- 新书内容连载(1):自定义Android组件之带图像的TextView
- 自定义Android组件之带图像的TextView
- AutoCompleteTextView 实现自定义匹配规则提示
- android 组件动画(二)——TextView刷入与刷出的效果
- TextView小组件的使用--附带超链接和跑马灯效果
- 自定义组件之【柱状图】详解 已封装成View