您的位置:首页 > 其它

自定义多选TextView组件

2014-10-29 10:52 211 查看
近期因为项目所需,不能使用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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: