自定义延时查询控件---valen

时间:2022-09-06 15:58:19

当查询已经成标配

查询是已成为每个应用常用的功能,也正是这样前端后对查询的设计需求也日益增加,本文针对前端(Android端)查询控件做一个例子;

控件设计与逻辑

产品的设计UI图;

自定义延时查询控件---valen

自定义延时查询控件---valen

要达到如下

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的更多相关文章

  1. C&num; Winform 通过FlowLayoutPanel及自定义的编辑控件,实现快速构建C&sol;S版的编辑表单页面

    个人理解,开发应用程序的目的,不论是B/S或是C/S结构类型,无非就是实现可供用户进行查.增.改.删,其中查询用到最多,开发设计的场景也最为复杂,包括但不限于:表格记录查询.报表查询.导出文件查询等等 ...

  2. &lbrack;转&rsqb;Oracle分页之二:自定义web分页控件的封装

    本文转自:http://www.cnblogs.com/scy251147/archive/2011/04/16/2018326.html 上节中,讲述的就是Oracle存储过程分页的使用方式,但是如 ...

  3. Winform 通过FlowLayoutPanel及自定义的编辑控件,实现快速构建C&sol;S版的编辑表单页面 z

    http://www.cnblogs.com/zuowj/p/4504130.html 不论是B/S或是C/S结构类型,无非就是实现可供用户进行查.增.改.删,其中查询用到最多,开发设计的场景 也最为 ...

  4. 基于 element-plus 封装一个依赖 json 动态渲染的查询控件

    前情回顾 基于 el-form 封装一个依赖 json 动态渲染的表单控件 Vue3 封装第三方组件(一)做一个合格的传声筒 功能 使用 vue3 + element-plus 封装了一个查询控件,专 ...

  5. kettle系列-&lbrack;KettleUtil&rsqb;kettle插件,类似kettle的自定义java类控件

    该kettle插件功能类似kettle现有的定义java类插件,自定java类插件主要是支持在kettle中直接编写java代码实现自定特殊功能,而本控件主要是将自定义代码转移到jar包,就是说自定义 ...

  6. &lpar;转&rpar;sl简单自定义win窗体控件

    sl简单自定义win窗体控件      相信大家接触过不少win窗体控件ChildWin子窗口就的sl自带的一个  而且网上也有很多类似的控件,而今天我和大家分享下自己制作个win窗体控件,希望对初学 ...

  7. WPF自定义控件与样式&lpar;8&rpar;-ComboBox与自定义多选控件MultComboBox

    一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 本文主要内容: 下拉选 ...

  8. jquery和css自定义video播放控件

    下面介绍一下通过jquery和css自定义video播放控件. Html5 Video是现在html5最流行的功能之一,得到了大多数最新版本的浏览器支持.包括IE9,也是如此.不同的浏览器提供了不同的 ...

  9. c&num;自定义液晶数字控件

    c#自定义液晶数字控件   项目中经常与硬件打交道,LED显示屏上面的液晶数字很好看,QT中直接就有数码管这个控件,C#中自己来写一个,其实掌握了一种自定义控件的写法,其他的都是浮云,举一反三,最笨的 ...

随机推荐

  1. PHP 文件夹操作「复制、删除、查看大小」迭代实现

    "既然递归能很好的解决,为什么还要用迭代呢"?主要的原因还是效率问题-- 递归的概念是函数调用自身,把一个复杂的问题分解成与其相似的多个子问题来解决,可以极大的减少代码量,使得程序 ...

  2. ABP框架详解(三)Domain

    此处的Domain主要指Abp类库根目录下Domain文件夹.顾名思义该目录下是用来存放与领域实体,领域逻辑执行,存储,领域服务相关的内容. 1.Entities (1)为整个Abp框架后期开发的所有 ...

  3. Day Tips:Remote 服务器黑屏

    如果是台式机:CTRL+ALT+End 笔记本一般情况下End建和其他的键混合使用,所以是Fn+CTRL+ALT+End

  4. Linux下svn命令详解

    本文主要是说明linux下svn命令的使用方法,同时记录自己在使用中遇到的一些疑惑. 1.Linux命令行下将文件checkout到本地目录 svn checkout url(url是服务器上的目录) ...

  5. java web基础1Tomcat服务器基本知识

    一.Tomcat安装 (1)先安装JDK,并配置环境变量JAVA_HOME.Tomcat服务器的配置需要JDK的JAVA_HOME环境变量. 并在系统path变量添加%JAVA_HOME%/bin. ...

  6. C&plus;&plus;&colon; getline函数

    转自http://blog.sina.com.cn/s/blog_60263c1c0101ck25.html 学习C++的同学可能都会遇到一个getline()函数,譬如在C++premer中,标准s ...

  7. ex2&colon;逻辑回归及正则条件下的练习

    EX2 逻辑回归练习 ​ 假设你是一个大学某系的管理员,你想根据两项考试结果来确定每个申请人的录取机会.你有以前申请人的历史资料以作为逻辑回归的训练集.对于每一个训练集,你拥有每个申请人的两项考试的分 ...

  8. poj2485 highwaysC语言编写

    /*HighwaysTime Limit: 1000MSMemory Limit: 65536KTotal Submissions: 33595Accepted: 15194DescriptionTh ...

  9. Rotation Proposals

    Rotation Proposals 论文Arbitrary-Oriented Scene Text Detection via Rotation Proposals 这篇论文提出了一个基于Faste ...

  10. java之集合Collection详解之3

    package cn.itcast_03; public class Student { // 成员变量 private String name; private int age; // 构造方法 p ...