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)