机器人:基于服务器响应实现应用程序的搜索建议 [英] android: Implement app search suggestion based on server response

查看:114
本文介绍了机器人:基于服务器响应实现应用程序的搜索建议的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要在我的Andr​​oid应用程序依赖于从服务器JSON响应建立一个搜索功能。用户将在设在动作条一个搜索查看输入搜索查询。根据什么类型的用户的查询将作出在服务器和服务器返回的响应应显示为下拉建议。我应该如何去做。基于我已阅读文档我需要实现一个内容提供商。什么是执行应用程序搜索的最巧妙的方法?

I need to build a search functionality in my android app which relies on json response from the server. The users will enter the search query in a searchview located in the actionbar. Based on what the user types a query will be made to the server and the server returned response should appear as drop down suggestion. How should I go about it . Based on the docs i have read I need to implement a content provider. What would be neatest way of implementing app search ?

推荐答案

请参阅下面的code我已经实现了EditText.You也可以做这样的事情:

See the below code I have implemented for EditText.You can also do something like this:

private ArrayList<JSONObject> mRightListOverlapData, mRightTempData;
mEdit_Search.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before,
                int count) {


        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
            // TODO Auto-generated method stub

        }

        @Override
        public void afterTextChanged(Editable s) {
            // TODO Auto-generated method stub
            mRightListOverlapData.clear();
            String searchTag = mEdit_Search.getText().toString();
            if (searchTag == null || searchTag.equals("")) {


                mRightTempData.clear();
                mOverlapAdapter.notifyDataSetChanged();

            } else if (searchTag.length() == 1) {

                    mRightListOverlapData.addAll(mRightTempData);



                    mOverlapAdapter.notifyDataSetChanged();
                } else {
                    **startServiceForSearchSuggestion(searchTag);**
                }


            } else {

                try {
                    if (mRightTempData.size() > 0) {

                        for (int i = 0; i < mRightTempData.size(); i++) {
                            if (mRightTempData.get(i)
                                    .getString("search_text").toLowerCase()
                                    .startsWith(searchTag.toLowerCase())) {
                                mRightListOverlapData.add(mRightTempData
                                        .get(i));
                            }
                        }
                        if (mRightListOverlapData.size() == 0) {
                            JSONObject noData = new JSONObject();
                            noData.put("search_text", "No Data");
                            mRightListOverlapData.add(noData);

                        }
                    }

                    mOverlapAdapter.notifyDataSetChanged();
                } catch (JSONException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }
        }
    });

当用户进入第1个字符在EditText.And然后保存所有响应到tempArray,当用户输入一个字符,将搜索服务由tempArray的元素,它会调用web服务。 方法startServiceForSearchSuggestion()是:

It will call webService when user enters 1st character in EditText.And then save all response into tempArray and when user enters another character it will search that element from tempArray. Method startServiceForSearchSuggestion() is:

private void startServiceForSearchSuggestion(String search_tag) {
    if (!Utils.isNetworkAvailable(getBaseContext())) {
        Toast.makeText(getBaseContext(), "No Network Available",
                Toast.LENGTH_SHORT).show();
    } else {
        Intent intent1 = new Intent(this, WebService.class);
        intent1.putExtra(METHOD, GET_SEARCH_SUGGESTION);
        intent1.putExtra("search_tag", search_tag);
        startService(intent1);
    }
}

这将启动网络服务来获得服务器的响应。 服务类是:

It will start webservice to get response from server. The service class is:

 public class WebService extends Service implements WebServiceConstants {
    private AppPreferences mPrefs;
    private static String TAG_WEB_SERVICE = "WebService";
    private static String DEVICE_TYPE = "android";
    private static String MESSAGE_CENTER = "gcm";
    private static String URL_JSON = "YOUR_URL";
    private Context mContext;
    private int METHOD_NAME = 1;
    private String mSearch_Tag = "";
    private DBQuery mDBQuery;
    public static boolean is_Service_Running = false;

    @Override
    public void onCreate() {
        // TODO Auto-generated method stub
        super.onCreate();
        mContext = this;
        mPrefs = new AppPreferences(mContext);
        mDBQuery = new DBQuery(mContext);

    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void onStart(Intent intent, int startId) {
        // TODO Auto-generated method stub
        try {
            METHOD_NAME = intent.getIntExtra(METHOD, 1);

                mSearch_Tag = intent.getStringExtra("search_tag");

            LoadDataFromServer data = new LoadDataFromServer();
            data.execute();
        } catch (NullPointerException e) {
            // TODO: handle exception
        }
        super.onStart(intent, startId);
    }

public class LoadDataFromServer extends AsyncTask<Void, Void, Void> {
        JSONObject response;

        @Override
        protected Void doInBackground(Void... params) {
            // TODO Auto-generated method stub
            JSONObject root = getJsonHeader();
            switch (METHOD_NAME) {


            case GET_SEARCH_SUGGESTION:
                response = getResponse(yourJsonRequestObject);
                break;

            }

            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            // TODO Auto-generated method stub
            try {

                switch (METHOD_NAME) {


                case GET_SEARCH_SUGGESTION:
                    Log.v(TAG_WEB_SERVICE,
                            "Response = GET_SEARCH_SUGGESTION : "
                                    + response.toString());
                    sendBroadcast(new Intent(METHOD_GET_SEARCH_SUGGESTION)
                            .putExtra("Response", response.toString()));

                    break;

                default:
                    break;
                }
            } catch (NullPointerException e) {
                // TODO: handle exception
            }

        }

    }
    }

onPostExecute方法,你必须发送广播的这个广播的活动和的onReceive可以节省您的JSON数据到arrayList.Like这样的:

onPostExecute method you have to send broadcast to your activity and onReceive of this broadCast you can save your Json data into arrayList.Like this:

private BroadcastReceiver mReceiverSearchSuggestion = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            // TODO Auto-generated method stub
            JSONObject root;
            try {
                root = new JSONObject(intent.getStringExtra("Response"));
                setSearchSuggestions(root);
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
    };

方法:

1。

private JSONObject getResponse(JSONObject obj) {
        // Create a new HttpClient and Post Header
        HttpClient httpclient = new DefaultHttpClient();
        HttpParams myParams = new BasicHttpParams();
        HttpConnectionParams.setConnectionTimeout(myParams, 10000);
        HttpConnectionParams.setSoTimeout(myParams, 10000);
        String temp = "";

        try {

            HttpPost httppost = new HttpPost(URL_JSON);
            httppost.setHeader("Content-type", "application/json");
            StringEntity se = new StringEntity(obj.toString());
            se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE,
                    "application/json"));
            httppost.setEntity(se);

            HttpResponse response = httpclient.execute(httppost);
            temp = EntityUtils.toString(response.getEntity());
            Log.v(TAG_WEB_SERVICE, "Temp = " + temp);
            if (temp == null || temp.trim().equals("")) {

            } else {
                return new JSONObject(temp);
            }
        } catch (ClientProtocolException e) {

        } catch (IOException e) {

        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

2。

private void setSearchSuggestions(JSONObject root) {
        // TODO Auto-generated method stub
        try {
            JSONObject search_suggestion = root
                    .getJSONObject(METHOD_GET_SEARCH_SUGGESTION);
            if (search_suggestion.getString("response_type").equalsIgnoreCase(
                    "success")) {
                if (search_suggestion.has("data")) {
                    mRightTempData.clear();
                    mRightListOverlapData.clear();
                    JSONArray data = search_suggestion.getJSONArray("data");
                    for (int i = 0; i < data.length(); i++) {
                        JSONObject value = data.getJSONObject(i);

                        mRightTempData.add(value);
                    }

                } else {
                    Toast.makeText(getBaseContext(),
                            "No data related to search", Toast.LENGTH_SHORT)
                            .show();
                }
            } else {
                Toast.makeText(getBaseContext(),
                        "Search Suggestion : Type Failure", Toast.LENGTH_SHORT)
                        .show();
            }


    }

我已经设置适配器JSON对象的ArrayList的是这样的:

I have set adapter with arrayList of Json Object like this:

        mOverlapAdapter = new RightOverlapAdapter(getBaseContext(),
            mRightListOverlapData);

    mDListRightOverLap.setAdapter(mOverlapAdapter);

您可以直接读取的JSONObject的ArrayList中的数据与指定的标签插入适配器的getView方法。

You can directly read data from ArrayList of JSONObject with specified tag into getView method of your adapter.

您需要定义此服务清单是这样的:

You need define this service in Manifest like this:

 <service android:name="com.your.package.WebService" />

希望它会帮助你。

Hope it will help you.

这篇关于机器人:基于服务器响应实现应用程序的搜索建议的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆