在AutoCompleteTextView中,我想在用户输入暂停1秒后显示自动完成列表。 我尝试使用处理程序
handler.postDelayed( new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
if ( text.length() >= 3 ) {
// do something
} else if ( text.length() == 0 ) {
// do something
}
}
}, 1000 );
此代码是onTextChanged的一部分。所以它发生的事情就是当postDelayed被调用并且内部代码将在一秒钟之后调用时,每当有文本更改时。那么我该怎样才能防止这种情况发生,因此只有当用户在打字时出现1秒钟的情况时才会调用内部代码。
e.g: 如果我输入Ind(暂停1秒),则应执行内部代码执行。 但是我键入印度然后内部代码不应该执行Ind,Indi,India。 需要你的建议。
答案 0 :(得分:2)
创建两个保存时间戳的静态变量
lastTimeStamp
和currentTimeStamp
,然后您可以执行以下操作:
@Override
public void run() {
if (currentTimeStamp - lastTimeStamp > 1000) {
// TODO Auto-generated method stub
if ( text.length() >= 3 ) {
// do something
} else if ( text.length() == 0 ) {
// do something
}
}
}
新方法:
在onTextChanged方法的开头,将当前的TimeStamp放在一个类变量中。
然后在onTextChanged中创建一个AsyncTask,它正在做一个
doInBackground方法中的Thread.sleep(1000)
然后在postExcute方法中创建一个if语句,检查类变量中TimeStamp与当前TimeStamp之间的差异,如果这大于1000,则发布处理程序。
答案 1 :(得分:1)
我只是站在同一个问题上 我在调用Googles Geocode建议API onTextChanged(),这引起了很多问题。 用户键入会导致大量API请求,其中大部分都不是必需的,并且会耗尽API(花钱)并减少用户从应用程序收到的体验。
我在这里考虑过这些解决方案,但我最终不喜欢它们中的任何一种,它们看起来不干净或者像黑客一样。
我不想进一步调用UI以获取View的当前值(再次)或检查系统时间。
原始问题实际上已经解决了问题,它只会导致多个runnables在用户输入时处于活动状态。
所以问题应该是:“如何在它导致麻烦之前删除我的匿名runnable?”
所有你需要做的就是使用原始方法(使用匿名runnable延迟调用),每当调用onTextChanged函数时,你删除任何以前的runnables。
您还可以扩展代码并检查值是否真的发生了变化(例如使用全局先前值String),这样如果用户输入了char并再次删除它,则不会终止runnable。
所以你需要做的就是: 1.使Handler成为类的变量,而不是在onTextChanged中创建它 2.在onTextChanged的开头,从处理程序中删除runnables
这是一个功能齐全的例子:
Handler onchangeHandler = new Handler();
String last_onTextChanged=""; // may speed up some cases of user input, can be removed
@Override
public void onTextChanged(CharSequence charSequence, int i, int i2, int i3)
{
final String value = charSequence.toString();
if (value.length() < 3) {autoCompleteAdapter.clear();return;} // threshold of 3 chars
if (!last_onTextChanged.equals(value))
onchangeHandler.removeCallbacksAndMessages(null);
else
return;
last_onTextChanged=value;
onchangeHandler.postDelayed(new Runnable()
{
@Override
public void run()
{
// RUN CODE HERE, fill your autoCompleteAdapter etc.
}
},800);
}
答案 2 :(得分:0)
有两个选项:
当你打算运行下一个任务时,使用Timer并对之前的任务调用cancel()。
扩展Runnable并传入一个字符串以进行此自动完成。如果此字符串不等于视图中的当前字符串(这意味着用户更改了字符串),则不应显示自动完成。
代码示例:
abstract class MyRunnable {
private String str;
public MyRunnable(String str) {
this.str = str;
}
}
...
handler.postDelayed(new MyRunnable(currentViewStr) {
@Override
public void run() {
if (currentViewStr.equals(str)) {
// show autocompletion
}
}
}, 1000);
答案 3 :(得分:0)
您还可以先在Runnable
onTextChanged()
消息