Android Smart Dict - 查询界面

来源:互联网 发布:itunes64位windows 编辑:程序博客网 时间:2024/05/17 04:11

上一次我们加载了词汇表,下面就可以提供单词查询功能了。

 

首先需要设计一个单词查询的界面,最简单的就用一个list 加一个input box即可,经济又实惠。

 

除此之外,我们还需要考虑list 的每一项究竟需要显示什么内容。仅仅是一个单词吗?这样未免太简单了吧。如果显示单词,音标,解释这些详细信息吗?这个看起来好像抢了单词详细界面的工作,没有必要,过多的信息显示在list项里边,看起来杂乱无章。显示在list项里面的信息必须有意义而且不能过多,所以我决定在list项里边依次显示单词,查询次数,学习次数,出错次数,单词等级。后面我们还可以根据这些信息排列单词的显示顺序。

 

查询界面主要就是一个list view和一个edit text,代码如下:

 

List item就是单词,查询次数,学习次数,出错次数,单词等级,代码如下:

 

 

来看看效果吧:

 

 

我们是如何将单词显示出来的?

默认无用户输入的时候显示所有的单词,用户输入关键词查询时自动过滤出符合条件的单词。

 

构造list我们首先需要adapter,这里我们使用CursorAdapter来做。

我们定义一个叫WordListAdapter的类,继承CursorAdapter。

代码如下:

 

这里需要注意一点,为什么我们需要定义一个叫做ViewHolder的类?主要就是为了避免每次bind view的时候都去find view by id,这样重复的工作没有意义而且耗费资源,因为系统会重用list item对应的view对象,真正new出来的item view对象只有屏幕显示出来可见的这么几个,并不是list有多少item就new多少个view。

 

下面我们来看如何做查询工作。

首先我们需要一个TextWatcher,在每次用户输入字母的时候,捕获输入框里面的string做查询。

代码如下:

 

当然我们可以通过保留前一次的输入结果来和现在的结果做比较从而屏蔽空格,在输入空格的时候不予理睬。

 

这样的实现还是有不足的地方,就是用户在每一次输入字母的时候,我们都会去做一次查询,想想用户如果查询sen开通的单词,当依次输入s,e,n这三个字母的时候,系统都会去分别去查询s,se,sen,前两次的查询可能是用户不需要的。当然除了这个问题,还有在做查询的时候,我们并没有新起单独的线程去做,有可能会阻塞掉我们的UI主线程进而导致系统弹出讨厌的ANR。那么我们如何取避免这些问题呢?

 

我想了一个办法,用looper和handler来自己构建一个消息处理机制,当用户下一次输入字母的间隔时间少于一个固定的值,好比500毫秒,我们就取消掉前一次的查询请求。这样,用户在连续输入sen这三个字母并且间隔时间不少于一个固定值的时候,s,se这两次查询就被取消了。这样就可以解决掉之前的问题。我想应该还有更好的方法,知道的请告诉我吧。

 

来看看代码:

 

首先是handler

 

这里要注意我们的handler类是静态的,对外部类的引用我用了weakReference,我们需要这么做,因为如果在Activity退出以后我们还保留了对它的引用,gc将不能回收它。

 

然后我们需要改改text watcher的实现:

 

在小于500毫秒的时候,remove掉前面的那个message。然后发一个新的message。

 

最后就是我们的handler thread需要在onpause关闭,在onresume启动:

 

 

来看看查询效果吧:

 

 

好不错,好吧,慢慢来,今天就到这里。

原创粉丝点击