自定义延时查询控件---valen
当查询已经成标配
查询是已成为每个应用常用的功能,也正是这样前端后对查询的设计需求也日益增加,本文针对前端(Android端)查询控件做一个例子;
控件设计与逻辑
产品的设计UI图;


要达到如下
1|、默认第一张图,中间展示默认提示文字,左边搜索图标;
2、输入文字后提示语消失,搜索的文字在后面,另外右边显示取消的图标
3、外加一个性能需求,我们搜索没必要每输入一个字都请求一次后台数据,有时候用户很快输入很多字符,就会导致大量没用的期过后,可以输入完等一段时间没输入才发起查询请求;
具体代码实现
先贴出代码后面做关键的解释
public class SearchDisplayView extends EditText {
private static int COUNTDOWN_INTERVAL = 300;
private DelayAfterTextChangedListener mDelayTextChangedListener;
public static interface DelayAfterTextChangedListener {
public void afterTextChanged(String keyword);
}
private CountDownTimer mCountDownTimer = new CountDownTimer(COUNTDOWN_INTERVAL, COUNTDOWN_INTERVAL) {
@Override
public void onTick(long millisUntilFinished) {
//间隔执行
}
@Override
public void onFinish() {
if(mDelayTextChangedListener != null) {
mDelayTextChangedListener.afterTextChanged(getText().toString());
}
}
};
public SearchDisplayView(Context context) {
this(context, null);
}
public SearchDisplayView(Context context, AttributeSet attrs) {
super(context, attrs);
if (isInEditMode()) {
return;
}
initViews();
}
private void initViews() {
setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_search, 0, 0, 0);
setTextAppearance(getContext(), R.style.LHBTextView_Medium_DaryGray);
setHintTextColor(getResources().getColor(R.color.light_gray));
setBackgroundResource(R.drawable.bg_corner_white);
int paddingLeft = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10,
getResources().getDisplayMetrics());
int paddingTop = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 4,
getResources().getDisplayMetrics());
setPadding(paddingLeft, paddingTop, paddingLeft, paddingTop);
setCompoundDrawablePadding(paddingLeft);
setGravity(Gravity.CENTER);
setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
if (getCompoundDrawables()[2] != null) {
boolean touchable = event.getX() > (getWidth() - getTotalPaddingRight()) &&
(event.getX() < ((getWidth() - getPaddingRight())));
if (touchable) {
setText("");
}
}
}
return false;
}
});
addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
boolean empty = TextUtils.isEmpty(s);
setCompoundDrawablesWithIntrinsicBounds(0, 0, !empty ? R.drawable.ic_dialog_close : 0, 0);
}
@Override
public void afterTextChanged(Editable s) {
if(mDelayTextChangedListener != null) {
mCountDownTimer.cancel();
mCountDownTimer.start();
}
}
});
setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
setTag(getHint());
setHint("");
} else {
setHint(getTag().toString());
}
setGravity(hasFocus ? Gravity.LEFT : Gravity.CENTER);
setCompoundDrawablesWithIntrinsicBounds(!hasFocus ? R.drawable.ic_search : 0, 0, getCompoundDrawables()[2] != null ? R.drawable.ic_dialog_close : 0, 0);
}
});
}
public void setDelayAfterTextChangedListener(DelayAfterTextChangedListener afterTextChangedListener) {
mDelayTextChangedListener = afterTextChangedListener;
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
if (mCountDownTimer != null) {
mCountDownTimer.cancel();
}
}
public void setDisplayHint(int resid) {
setHint(resid);
setTag(getResources().getString(resid));
}
}
查看代码
1、代码继承EditText实现输入框的查询;
2、initView()初始化查询控件的样式和相关事件触发;
3、setOnTouchListener()处理右边"点击关闭图标"的出现时机和清楚输入文字处理;
4、addTextChangedListener() 监听文字变化,当中 onTextChanged() 回调函数处理左边样式控制,afterTextChanged() 做延时查询处理;
5、setOnFocusChangeListener() 处理在获得焦点的时候样式的变化,如提示语消失和文字靠左;
6、延时处理核心在CountDownTimer这个匿名内部类段落,里面重写了CountDownTimer回调方法并实现自己的逻辑,这是一个时间倒数的处理类,通过人肉实验300毫秒能处理好少请求并查询速度响应的时点;到最后在控件脱离窗体的时候onDetachedFromWindow(),为了安全起见别忘了重新取消下定时的操作;
7、这样控件并封装完成,在需要使用的地方直接引用就可以,需要延时的则调用监听方法setDelayAfterTextChangedListener() 可以使用;
最后
上面以安卓为例子,IOS WEB端当然也可以实现自己的延时查询控件,达到一次编写,到处运行;
自定义延时查询控件---valen的更多相关文章
- C# Winform 通过FlowLayoutPanel及自定义的编辑控件,实现快速构建C/S版的编辑表单页面
个人理解,开发应用程序的目的,不论是B/S或是C/S结构类型,无非就是实现可供用户进行查.增.改.删,其中查询用到最多,开发设计的场景也最为复杂,包括但不限于:表格记录查询.报表查询.导出文件查询等等 ...
- [转]Oracle分页之二:自定义web分页控件的封装
本文转自:http://www.cnblogs.com/scy251147/archive/2011/04/16/2018326.html 上节中,讲述的就是Oracle存储过程分页的使用方式,但是如 ...
- Winform 通过FlowLayoutPanel及自定义的编辑控件,实现快速构建C/S版的编辑表单页面 z
http://www.cnblogs.com/zuowj/p/4504130.html 不论是B/S或是C/S结构类型,无非就是实现可供用户进行查.增.改.删,其中查询用到最多,开发设计的场景 也最为 ...
- 基于 element-plus 封装一个依赖 json 动态渲染的查询控件
前情回顾 基于 el-form 封装一个依赖 json 动态渲染的表单控件 Vue3 封装第三方组件(一)做一个合格的传声筒 功能 使用 vue3 + element-plus 封装了一个查询控件,专 ...
- kettle系列-[KettleUtil]kettle插件,类似kettle的自定义java类控件
该kettle插件功能类似kettle现有的定义java类插件,自定java类插件主要是支持在kettle中直接编写java代码实现自定特殊功能,而本控件主要是将自定义代码转移到jar包,就是说自定义 ...
- (转)sl简单自定义win窗体控件
sl简单自定义win窗体控件 相信大家接触过不少win窗体控件ChildWin子窗口就的sl自带的一个 而且网上也有很多类似的控件,而今天我和大家分享下自己制作个win窗体控件,希望对初学 ...
- WPF自定义控件与样式(8)-ComboBox与自定义多选控件MultComboBox
一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 本文主要内容: 下拉选 ...
- jquery和css自定义video播放控件
下面介绍一下通过jquery和css自定义video播放控件. Html5 Video是现在html5最流行的功能之一,得到了大多数最新版本的浏览器支持.包括IE9,也是如此.不同的浏览器提供了不同的 ...
- c#自定义液晶数字控件
c#自定义液晶数字控件 项目中经常与硬件打交道,LED显示屏上面的液晶数字很好看,QT中直接就有数码管这个控件,C#中自己来写一个,其实掌握了一种自定义控件的写法,其他的都是浮云,举一反三,最笨的 ...
随机推荐
- iPhone 已停用
如果你的iPhone上出现了如下的显示,你可以参考苹果官网上的 iOS设备已停用 如果你看到了这篇文章,你比我幸运多了. 参考这一个条目,你也许就不会丢失里面的数据了. 可怜的我,出现这个问题时还没 ...
- J2EE开发之常用开源项目介绍
主要就我所了解的J2EE开发的框架或开源项目做个介绍,可以根据需求选用适当的开源组件进行开发.主要还是以Spring为核心,也总结了一些以前web开发常用的开源工具和开源类库 1持久层: 1)Hibe ...
- AIX 内存使用情况
cat > WHAT_EVER_YOU_WANT.sh#!/usr/bin/ksh#memory calculatorum=`svmon -G | head -2|tail -1| awk {' ...
- MongoDB 学习笔记(一)基础篇
1.MongoDB 特点 面向集合存储,存储对象类型的数据方便 模式自由,不需要定义任何模式(schma) 动态查询 完全索引,包含内部对象 复制和故障恢复方便 高效的二进制数据存储 支持c# 平台驱 ...
- HTTP 请求方式: GET和POST的比较
GET和POST是HTTP的两个常用方法. 什么是HTTP? 超文本传输协议(HyperText Transfer Protocol -- HTTP)是一个设计来使客户端和服务器顺利进行通讯的协议 ...
- 浅析JavaScript函数的参数
ECAMScript函数不介意传递进来多少个参数,也不介意传递的参数的类型,即使定义的函数只接受两个参数,当调用该函数时没有传递参数,甚至传递了三个参数等等都无所谓,这是因为在ECAMScript中参 ...
- 51nod1586 约数和
果然我自己写的读入优化naive!...换题目给的读入优化就A了...话说用visual交快了好多啊... const int BufferSize=1<<16; char buffer[ ...
- Codeforces 505 A Mr. Kitayuta's Gift【暴力】
题意:给出一个字符串,可以向该字符串的任意位置插入一个字母使其变成回文串 因为字符串的长度小于10,枚举插入的字母,和要插入的位置,再判断是否已经满足回文串 #include<iostream& ...
- mysql 调用带返回值的存储过程
存储过程: create procedure proc_t(out uname varchar(50),out upwd varchar(50),in uid int) BEGIN select na ...
- MVC+Ef项目(1) 项目的框架搭建
一:首先我们来搭建最基本的项目框架,这里使用MVC3作为web项目,然后我们添加几个类库项目 最后的项目如下, 其中有一个 YouJiao.MvcWeb.Repository 实际就当做是 DAL层即 ...