Java 如何一次点击而不是两次点击显示搜索结果?
我正在创建一个Android应用程序,它具有搜索在线数据库的搜索功能。当我想搜索一些东西时,我必须双击搜索按钮以显示正确的结果。我相信问题在于我在onClick中为按钮使用了Asynctask函数。这是我的重点:Java 如何一次点击而不是两次点击显示搜索结果?,java,android,android-asynctask,Java,Android,Android Asynctask,我正在创建一个Android应用程序,它具有搜索在线数据库的搜索功能。当我想搜索一些东西时,我必须双击搜索按钮以显示正确的结果。我相信问题在于我在onClick中为按钮使用了Asynctask函数。这是我的重点: public void onSearchClick(View view) throws TVDBOutboundConnectionException { ConnectivityManager connMgr = (ConnectivityManager) getSystem
public void onSearchClick(View view) throws TVDBOutboundConnectionException {
ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isConnected()) {
// fetch data
new SeriesSearchTask().execute(text.getText().toString());
} else {
// display error
}
final ListView listview = (ListView) findViewById(R.id.listview);
final ArrayList<String> list = new ArrayList<String>();
for (int i = 0; i < ALTS.size(); i++) {
list.add(ALTS.get(i).getSeriesName());
}
final StableArrayAdapter adapter = new StableArrayAdapter(this,
android.R.layout.simple_list_item_1, list);
listview.setAdapter(adapter);
listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, final View view,
int position, long id) {
final String item = (String) parent.getItemAtPosition(position);
view.animate().setDuration(2000).alpha(0)
.withEndAction(new Runnable() {
@Override
public void run() {
list.remove(item);
adapter.notifyDataSetChanged();
view.setAlpha(1);
}
});
}
});
}
public void onSearchClick(视图视图)抛出TVDOutboundConnectionException{
ConnectivityManager connMgr=(ConnectivityManager)getSystemService(Context.CONNECTIVITY_服务);
NetworkInfo NetworkInfo=connMgr.getActiveNetworkInfo();
if(networkInfo!=null&&networkInfo.isConnected()){
//获取数据
新建seriesarchtask().execute(text.getText().toString());
}否则{
//显示错误
}
最终ListView ListView=(ListView)findViewById(R.id.ListView);
最终ArrayList=新ArrayList();
对于(int i=0;i
这是我的Asynctask方法:
private class SeriesSearchTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... urls) {
// params comes from the execute() call: params[0] is the url.
try {
ALTS = DB.searchSeriesInTVDB(urls[0], Language.ENGLISH);
return Integer.toString(ALTS.size());
} catch (TVDBOutboundConnectionException e) {
return "Unable to retrieve web page. URL may be invalid.";
}
}
// onPostExecute displays the results of the AsyncTask.
@Override
protected void onPostExecute(String result) {
}
}
私有类SeriesSearchTask扩展了AsyncTask{
@凌驾
受保护的字符串doInBackground(字符串…URL){
//params来自execute()调用:params[0]是url。
试一试{
ALTS=DB.searchSeriesInTVDB(url[0],Language.ENGLISH);
返回整数.toString(ALTS.size());
}捕获(TVDOutboundConnectionException e){
return“无法检索网页。URL可能无效。”;
}
}
//onPostExecute显示异步任务的结果。
@凌驾
受保护的void onPostExecute(字符串结果){
}
}
因此,我的问题是,我如何让方法在一次搜索点击中显示正确的结果,因为这是正常的和预期的。感谢您的帮助,并提前感谢您的努力。您所面临的问题是由于AsyncTask的工作方式。 AsyncTask中的代码在单独的线程上运行,因此在AsyncTask完成其工作之前,会立即执行随后的行 要在AsyncTask完成后更新UI,需要在
onPostExecute()
方法中执行代码
只需将代码移到自己的方法中:
public void updateUi(){
final ListView listview = (ListView) findViewById(R.id.listview);
final ArrayList<String> list = new ArrayList<String>();
for (int i = 0; i < ALTS.size(); i++) {
list.add(ALTS.get(i).getSeriesName());
}
final StableArrayAdapter adapter = new StableArrayAdapter(this,
android.R.layout.simple_list_item_1, list);
listview.setAdapter(adapter);
//...
}
public void updateUi(){
最终ListView ListView=(ListView)findViewById(R.id.ListView);
最终ArrayList=新ArrayList();
对于(int i=0;i
然后将活动移交给AsyncTask,并在执行后在UI线程上运行此方法
private class SeriesSearchTask extends AsyncTask<String, Void, String> {
MyActivity mActivity;
public SeriesSearchTask(final MyActivity _activity){
mActivity = _activity;
}
@Override
protected String doInBackground(String... urls) {
// params comes from the execute() call: params[0] is the url.
try {
ALTS = DB.searchSeriesInTVDB(urls[0], Language.ENGLISH);
return Integer.toString(ALTS.size());
} catch (TVDBOutboundConnectionException e) {
return "Unable to retrieve web page. URL may be invalid.";
}
}
// onPostExecute displays the results of the AsyncTask.
@Override
protected void onPostExecute(String result) {
//updating the UI here
if(mActivity != null){
mActivity.runOnUiThread(new Runnable(){
public void run(){
mActivity.updateUi();
}
}
}
}
}
私有类SeriesSearchTask扩展了AsyncTask{
我的活动能力;
公共序列搜索任务(最终MyActivity\U活动){
mActivity=_活动;
}
@凌驾
受保护的字符串doInBackground(字符串…URL){
//params来自execute()调用:params[0]是url。
试一试{
ALTS=DB.searchSeriesInTVDB(url[0],Language.ENGLISH);
返回整数.toString(ALTS.size());
}捕获(TVDOutboundConnectionException e){
return“无法检索网页。URL可能无效。”;
}
}
//onPostExecute显示异步任务的结果。
@凌驾
受保护的void onPostExecute(字符串结果){
//在此处更新UI
if(mActivity!=null){
mActivity.runOnUiThread(新的Runnable(){
公开募捐{
mActivity.updateUi();
}
}
}
}
}
一个更好的解决方案是使用事件总线通知活动。查看他们的网站,这非常简单。非常感谢!我将阅读关于事件总线的内容,因为了解事件总线很好,以供将来参考。