自定义多选TextView组件

近期因为项目所需,不能使用spinner组件,所以写了一个自定义多选TextView组件。如下:

思路:监听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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值