代码:
/**
* Created on 2017/8/8.
* 继承自EditText的自定义view
* 主要完成2件事情:1.输入内容时,显示清除图标
* 2.当点击了清除图标时,清除EditText里的内容
*/
public class ClearEditText extends AppCompatEditText implements
OnFocusChangeListener, TextWatcher {
private Drawable mClearDrawable;
public ClearEditText(Context context) {
this(context, null);
}
public ClearEditText(Context context, AttributeSet attrs) {
this(context, attrs, android.R.attr.editTextStyle);
}
public ClearEditText(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
private void init() {
//初始化:首先,加载清除图标(不显示);其次,绘制editText的区域;设置监听接口
//获得EditText的右边图像,没有就加载进来
mClearDrawable = getCompoundDrawables()[2];
if (mClearDrawable == null) {
mClearDrawable = getResources()
.getDrawable(R.drawable.emotionstore_progresscancelbtn);
}
//getIntrinsicWidth()获得固定大小
mClearDrawable.setBounds(0, 0, mClearDrawable.getIntrinsicWidth(), mClearDrawable.getIntrinsicHeight());
setClearIconVisible(false); //初始化的时候先不显示
setOnFocusChangeListener(this);
addTextChangedListener(this);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
//以up事件为标志,判断点击事件的落点,然后清除内容
if (getCompoundDrawables()[2] != null) {
if (event.getAction() == MotionEvent.ACTION_UP) {
boolean touchable = event.getX() > (getWidth()
- getPaddingRight() - mClearDrawable.getIntrinsicWidth())
&& (event.getX() < ((getWidth() - getPaddingRight())));
if (touchable) {
this.setText("");
}
}
}
return super.onTouchEvent(event);
}
//重写聚焦监听接口OnFocusChangeListener的方法onFocusChange
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
//输入的文字大于0就出现图像
setClearIconVisible(getText().length() > 0);
} else {
setClearIconVisible(false);
}
}
//使用setCompoundDrawables设置右边的清除图标
protected void setClearIconVisible(boolean visible) {
Drawable right = visible ? mClearDrawable : null;
setCompoundDrawables(getCompoundDrawables()[0],
getCompoundDrawables()[1], right, getCompoundDrawables()[3]);
}
@Override
public void onTextChanged(CharSequence s, int start, int count,
int after) {
setClearIconVisible(s.length() > 0); //text内容改变不一定就要显示,必须大于0
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
@Override
public void afterTextChanged(Editable s) {}
}
/**
* 根据输入框中的值来过滤数据并更新RecyclerView
*
* @param filterStr
*/
private void filterData(String filterStr) {
List<Friends> filterDateList = new ArrayList<>();
if (TextUtils.isEmpty(filterStr)) {
filterDateList = SourceDateList;
} else {
filterDateList.clear();
for (Friends sortModel : SourceDateList) {
String name = sortModel.getName();
if (name.indexOf(filterStr.toString()) != -1 ||
PinyinUtils.getFirstSpell(name).startsWith(filterStr.toString())
//不区分大小写
|| PinyinUtils.getFirstSpell(name).toLowerCase().startsWith(filterStr.toString())
|| PinyinUtils.getFirstSpell(name).toUpperCase().startsWith(filterStr.toString())
) {
filterDateList.add(sortModel);
}
}
}
// 根据a-z进行排序
Collections.sort(filterDateList, pinyinComparator);
adapter.updateList(filterDateList);
}