我需要在我的Android应用程序中构建一个搜索功能,它依赖于服务器的json响应。用户将在位于操作栏中的搜索视图中输入搜索查询。根据用户类型,将对服务器进行查询,并且服务器返回的响应应显示为下拉建议。我应该怎么做呢。根据我读过的文档,我需要实现一个内容提供者。什么是实现应用搜索的最佳方式?
这是我的SearchActivity.java
package com.accure.health;
import android.os.Bundle;
import android.app.Activity;
import android.app.SearchManager;
import android.content.Context;
import android.view.Menu;
import android.view.MenuInflater;
import android.widget.SearchView;
import android.widget.TextView;
public class SearchActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_search);
TextView tv = (TextView) findViewById(R.id.user_label);
tv.setText(" Welcome, " + getIntent().getExtras().getString("name"));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
//getMenuInflater().inflate(R.menu.search, menu);
//return true;
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.search, menu);
// Associate searchable configuration with the SearchView
SearchManager searchManager =(SearchManager)getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = (SearchView) menu.findItem(R.id.patient_search)
.getActionView();
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
return super.onCreateOptionsMenu(menu);
}
}
这是我的SearchResultActivity.java
package com.accure.health;
import android.os.Bundle;
import android.app.ActionBar;
import android.app.Activity;
import android.app.SearchManager;
import android.content.Intent;
import android.view.Menu;
import android.widget.TextView;
public class SearchResultsActivity extends Activity {
TextView txtQuery;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_search_results);
ActionBar actionBar = getActionBar();
// Enabling Back navigation on Action Bar icon
actionBar.setDisplayHomeAsUpEnabled(true);
txtQuery = (TextView) findViewById(R.id.txt_Query);
handleIntent(getIntent());
}
@Override
protected void onNewIntent(Intent intent) {
setIntent(intent);
handleIntent(intent);
}
/**
* Handling intent data
*/
private void handleIntent(Intent intent) {
if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
String query = intent.getStringExtra(SearchManager.QUERY);
/**
* Use this query to display search results like
* 1. Getting the data from SQLite and showing in listview
* 2. Making webrequest and displaying the data
* For now we just display the query only
*/
txtQuery.setText("Search Query: " + query);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.search_results, menu);
return true;
}
}
答案 0 :(得分:0)
好的,简单直接的:
实施Observer模式以从服务器请求数据。
//用于通知请求客户端的接口,关于检索到的数据
public interface GetData{
public void onSuccess(Array[data]);
public void onError();
}
保持您的数据从服务器获取逻辑,就像我给你输入XXX一样,你的逻辑应该从服务器检索数据,一旦从服务器通过另一个工作线程检索数据通过使用{{ 1}}或onSuccess
onError
基本系统准备就绪,现在在android here中阅读// possible API
public void fetchData(String text, GetData listener){
//... bla bla bla, you fire up and async task here
new DataTask(listener).execute(text);
// bla bla bla
}
DataTask extends AsyncTask<String,Integer,Integer>{
public DataTask(GetData listener){
..
}
...
onPostExecute(){
listener.success or error
}
它有一个与之关联的适配器,通过该适配器向下显示给用户。
现在,您可以在用户在文本框中输入内容时调用此逻辑,例如,如果用户键入XXX,则启动逻辑以获取数据,一旦通过AutoCompleteTextView
重新生成数据,您就准备了一个adater并将其设置为AutoCompeteView。
完整实施here