近期因为项目所需,不能使用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