有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

来自服务器的java 安卓搜索建议

我需要在我的安卓应用程序中构建一个搜索功能,它依赖于来自服务器的json响应。用户将在actionbar中的searchview中输入搜索查询。根据用户类型,将向服务器进行查询,服务器返回的响应应显示为下拉建议。我该怎么做呢。根据我读过的文档,我需要实现一个内容提供者。实现应用程序搜索的最整洁的方式是什么

这是我的搜索活动。爪哇

package com.accure.health;

import 安卓.os.Bundle;
import 安卓.app.Activity;
import 安卓.app.SearchManager;
import 安卓.content.Context;
import 安卓.view.Menu;
import 安卓.view.MenuInflater;
import 安卓.widget.SearchView;
import 安卓.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);
}
}

这是我的搜索结果。爪哇

package com.accure.health;

import 安卓.os.Bundle;
import 安卓.app.ActionBar;
import 安卓.app.Activity;
import 安卓.app.SearchManager;
import 安卓.content.Intent;
import 安卓.view.Menu;
import 安卓.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) 个答案

  1. # 1 楼答案

    好的,简单明了:

    1. 实现用于从服务器请求数据的观察者模式

      //将检索到的数据通知回请求客户端的接口

       public interface GetData{
           public void onSuccess(Array[data]);
           public void onError();
        }
      
    2. 将从服务器获取数据的逻辑放在手边,比如当我给您输入XXX时,您的逻辑应该从服务器检索数据,一旦通过另一个工作线程从服务器检索到数据,使用onSuccessonError将其通知回客户机

      // 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
        }
      
    3. 我们的基本系统已经准备好了,现在请阅读android here中的AutoCompleteTextView。它有一个与之关联的适配器,通过该适配器,建议将作为下拉列表显示给用户

    4. 现在,当用户在文本框中键入某个内容时,您可以调用此逻辑,例如,如果用户键入XXX,则启动获取数据的逻辑,一旦通过onSuccess检索数据,您就准备一个适配器并将其设置为您的AutoCompeteView

    完整实现here