我遇到了一个优化问题:我想做一个动态的AutoCompleteTextView,所以我实现了#34; TextWatcher"到我的班级。我希望每次用户输入并暂停或完成输入时,我都会启动我的数据库请求以获取自动填充列表,所以我的问题是:
我如何知道用户何时在AutoCompleteTextView中完成/暂停输入?
实际上,每次用户输入一个字符时,我的代码都会发出请求。所以对于"你好"它会向我的数据库发送4个请求,但是我需要它向完整的世界发送一个独特的请求"你好"当用户完成输入时。
这可能吗?
这是我实际代码的一部分:
public class MainActivity extends AppCompatActivity implements TextWatcher {
public final static String CLUB_NAME = "com.mycompany.myfirstapp.FAV_CLUB";
List<devaddict.footbarcom.modelPOJO.Object> list;
Button searching;
AutoCompleteTextView searchbar_club;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
searching = (Button)findViewById(R.id.buttonseek);
searchbar_club = (AutoCompleteTextView) findViewById(R.id.searchbar_club);
searchbar_club.addTextChangedListener(this);
searchbar_club.setThreshold(3);
}
然后,在同一&#34; MainActivity&#34;上课,下面我得到了论文:
@Override
public void onTextChanged(final CharSequence s, final int start, final int before, final int count) {
System.out.println("TEXT CHANGED BY onTextChanged");
}
@Override
public void beforeTextChanged(final CharSequence s, final int start, final int count, final int after) {
}
@Override
public void afterTextChanged(final Editable s) {
//System.out.println("TEXT CHANGED BY afterTextChanged");
}
我认为&#34; afterTextChanged&#34;方法将是我真正想要的,但我没有看到它和onTextChanged之间的任何区别。
System.out仅用于测试。
答案 0 :(得分:3)
onTextChanged()是您可以记下逻辑的主要方法。 如果您愿意等待用户输入2个或更多单词,您可以编写onTextChanged()方法,如下所示:
@Override
public void onTextChanged(final CharSequence s, final int start, final int before, final int count) {
if(count > 4){
new Handler().postDelayed(new Runnable(){
public void run(){
//write db insertion logic here...
}},700);
}
}
基本上你等待700毫秒然后做一些动作以确保用户可能已经停止输入..
看看这有帮助!!
P.S:阿里在下面使用计时器的答案也是解决OP问题的正确方法
答案 1 :(得分:1)
Timer timer;
@Override
public void onTextChanged(final CharSequence s, final int start, final int before, final int count) {
timer = new Timer();
timer.schedule(new TimerTask()
{
@Override
public void run()
{
MainActivity.activity.runOnUiThread(new Runnable() {
@Override
public void run() {
timer.cancel();
//do something
}
});
}
}, 1000);//after 1 second do whatever you want
}
@Override
public void beforeTextChanged(final CharSequence s, final int start, final int count, final int after) {
}
@Override
public void afterTextChanged(final Editable s) {
//System.out.println("TEXT CHANGED BY afterTextChanged");
}
答案 2 :(得分:0)
以下是使用Kotlin和Coroutines的方法: 首先在“活动”或“片段”中定义用于执行此操作的作业,如下所示:
private var textChangeCountDownJob: Job = Job()
然后添加这样的文本查看器:
editText.doAfterTextChanged {
textChangeCountDownJob.cancel()
textChangeCountDownJob = lifecycleScope.launch {
delay(500) // for half a second delay, as an example
search(it.toString()) // doing your logic here
}
}