package
com.example.junweiliu.commonlysearchview;
import
android.content.context;
import
android.content.res.typedarray;
import
android.graphics.bitmap;
import
android.graphics.canvas;
import
android.graphics.drawable.bitmapdrawable;
import
android.graphics.drawable.drawable;
import
android.text.editable;
import
android.text.textwatcher;
import
android.util.attributeset;
import
android.util.log;
import
android.view.layoutinflater;
import
android.view.view;
import
android.widget.baseadapter;
import
android.widget.button;
import
android.widget.edittext;
import
android.widget.imageview;
import
android.widget.linearlayout;
import
android.widget.listview;
import
java.util.arraylist;
import
java.util.list;
/**
* created by junweiliu on 16/5/31.
*/
public
class
commolysearchview<t>
extends
linearlayout {
/**
* 上下文
*/
private
context mcontext;
/**
* 编辑框
*/
private
edittext medittext;
/**
* 清除按钮
*/
private
imageview mclearimg;
/**
* 搜索图标
*/
private
imageview msearchbarimg;
/**
* 适配器
*/
private
baseadapter madapter;
/**
* 数据源
*/
private
list<t> mdatas =
new
arraylist<t>();
/**
* 数据源副本
*/
private
list<t> mdupdatas =
new
arraylist<t>();
/**
* 筛选后的数据源
*/
private
list<t> mfilterdatas =
new
arraylist<t>();
/**
* 筛选后的数据源副本
*/
private
list<t> mdupfilterdatas =
new
arraylist<t>();
/**
* 搜索图标
*/
private
bitmap msearchicon;
/**
* 搜索框距离左边边距
*/
private
int
msearchiconmarginleft;
/**
* 搜索框距离右边边距
*/
private
int
msearchiconmarginright;
/**
* 清除图标
*/
private
bitmap mclearicon;
/**
* 清除图标距离左边边距
*/
private
int
mcleariconmarginleft;
/**
* 清除图标距离右边边距
*/
private
int
mcleariconmarginright;
/**
* 搜索文字大小
*/
private
int
msearchtextsize;
/**
* 搜索文字颜色
*/
private
int
msearchtextcolor;
/**
* 回调接口
*
* @param <t>
*/
interface
searchdatas<t> {
/**
* 参数一:全部数据,参数二:筛选后的数据,参数三:输入的内容
*
* @param datas
* @param filterdatas
* @param inputstr
* @return
*/
list<t> filterdatas(list<t> datas, list<t> filterdatas, string inputstr);
}
/**
* 回调
*/
private
searchdatas<t> mlistener;
/**
* 设置回调
*
* @param listener
*/
public
void
setsearchdatalistener(searchdatas<t> listener) {
mlistener = listener;
}
public
commolysearchview(context context) {
this
(context,
null
);
}
public
commolysearchview(context context, attributeset attrs) {
this
(context, attrs,
0
);
}
public
commolysearchview(context context, attributeset attrs,
int
defstyleattr) {
super
(context, attrs, defstyleattr);
mcontext = context;
// 自定义属性
typedarray ta = context.obtainstyledattributes(attrs, r.styleable.commolysearchview);
drawable searchd = ta.getdrawable(r.styleable.commolysearchview_searchbariconsrc);
msearchicon = drawabletobitamp(searchd);
msearchiconmarginleft = px2dip(context, ta.getdimensionpixeloffset(r.styleable.commolysearchview_searchbariconmarginleft,
0
));
msearchiconmarginright = px2dip(context, ta.getdimensionpixeloffset(r.styleable.commolysearchview_searchbariconmarginright,
0
));
drawable cleard = ta.getdrawable(r.styleable.commolysearchview_cleariconsrc);
mclearicon = drawabletobitamp(cleard);
mcleariconmarginleft = px2dip(context, ta.getdimensionpixeloffset(r.styleable.commolysearchview_cleariconmarginleft,
0
));
mcleariconmarginright = px2dip(context, ta.getdimensionpixeloffset(r.styleable.commolysearchview_cleariconmarginright,
0
));
msearchtextsize = px2sp(context, ta.getdimensionpixeloffset(r.styleable.commolysearchview_searchtextsize,
0
));
msearchtextcolor = ta.getcolor(r.styleable.commolysearchview_searchtextcolor,
0
);
ta.recycle();
// 绑定布局文件
layoutinflater.from(context).inflate(r.layout.searchview_layout,
this
);
initview();
}
/**
* 初始化控件
*/
private
void
initview() {
medittext = (edittext) findviewbyid(r.id.et_search);
mclearimg = (imageview) findviewbyid(r.id.iv_search_clear);
msearchbarimg = (imageview) findviewbyid(r.id.iv_search_icon);
// 处理自定义属性
if
(
0
!= msearchiconmarginleft ||
0
!= msearchiconmarginright) {
msearchbarimg.setpadding(msearchiconmarginleft,
0
, msearchiconmarginright,
0
);
}
if
(
0
!= mcleariconmarginleft ||
0
!= mcleariconmarginright) {
mclearimg.setpadding(mcleariconmarginleft,
0
, mcleariconmarginright,
0
);
}
if
(
null
!= msearchicon) {
msearchbarimg.setimagebitmap(msearchicon);
}
if
(
null
!= mclearicon) {
mclearimg.setimagebitmap(mclearicon);
}
if
(
0
!= msearchtextsize) {
medittext.settextsize(msearchtextsize);
}
if
(
0
!= msearchtextcolor) {
medittext.settextcolor(msearchtextcolor);
}
// 清空按钮处理事件
mclearimg.setonclicklistener(
new
onclicklistener() {
@override
public
void
onclick(view view) {
medittext.settext(
""
);
mclearimg.setvisibility(view.gone);
if
(
null
!= mdatas) {
mdatas.clear();
}
mdatas.addall(mdupdatas);
madapter.notifydatasetchanged();
resetdatas();
}
});
// 搜索栏处理事件
medittext.addtextchangedlistener(
new
textwatcher() {
@override
public
void
beforetextchanged(charsequence charsequence,
int
i,
int
i1,
int
i2) {
}
@override
public
void
ontextchanged(charsequence charsequence,
int
i,
int
i1,
int
i2) {
// 获取筛选后的数据
mfilterdatas = mlistener.filterdatas(mdupdatas, mfilterdatas, charsequence.tostring());
if
(charsequence.tostring().length() >
0
&& !charsequence.tostring().equals(
""
)) {
mclearimg.setvisibility(view.visible);
}
else
{
mclearimg.setvisibility(view.gone);
}
if
(
null
!= mdatas) {
mdatas.clear();
}
mdatas.addall(mfilterdatas);
madapter.notifydatasetchanged();
resetdatas();
}
@override
public
void
aftertextchanged(editable editable) {
}
});
}
/**
* 获取筛选后的数据
*
* @return
*/
public
list<t> getfilterdatas() {
return
(
null
!= mdupfilterdatas && mdupfilterdatas.size() >
0
)