来自服务器的android搜索建议

时间:2014-08-14 06:49:17

标签: java android

我需要在我的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;
}

}

1 个答案:

答案 0 :(得分:0)

好的,简单直接的:

  1. 实施Observer模式以从服务器请求数据。

    //用于通知请求客户端的接口,关于检索到的数据

     public interface GetData{
         public void onSuccess(Array[data]);
         public void onError();
      }
    
  2. 保持您的数据从服务器获取逻辑,就像我给你输入XXX一样,你的逻辑应该从服务器检索数据,一旦从服务器通过另一个工作线程检索数据通过使用{{ 1}}或onSuccess

    onError
  3. 基本系统准备就绪,现在在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 } 它有一个与之关联的适配器,通过该适配器向下显示给用户。

    < / LI>
  4. 现在,您可以在用户在文本框中输入内容时调用此逻辑,例如,如果用户键入XXX,则启动逻辑以获取数据,一旦通过AutoCompleteTextView重新生成数据,您就准备了一个adater并将其设置为AutoCompeteView。

  5. 完整实施here