android中的自动完成功能无法使用动态数据

时间:2011-12-28 07:52:04

标签: android

我在Android中遇到自动完成问题。我试图在匹配的每个按键上动态地从其他应用程序读取数据,而不是在Activity本身中对数据进行硬编码。请在我的程序下面找到并告诉我我错在哪里。

注意:第一次按键时,结果会被填充。之后,如果我清除输入的文本并输入不同的字符,结果将不会显示在自动完成下拉框中。我在每次按键时从其他应用程序获取,但没有在自动完成下拉框中填充。

我尝试使用textView.showDropDown();和adapter.setNotifyOnChange(true);选项。但没用。

package com.util;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.StatusLine;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONObject;

import android.app.Activity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;

public class HelloAutoCompleteActivity extends Activity {
List countries = new ArrayList();
    String url = ""; //some application url
AutoCompleteTextView textView;
ArrayAdapter<String> adapter;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    textView = (AutoCompleteTextView) findViewById(R.id.autocomplete_country);
    textView.addTextChangedListener(new CostomTextWatcher());
    textView.setThreshold(1);
    adapter = new ArrayAdapter<String>(this, R.layout.list_item, countries);
    textView.setAdapter(adapter);
}

private class CostomTextWatcher implements TextWatcher {

    @Override
    public void afterTextChanged(Editable s) {
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count,
            int after) {
    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before,
            int count) {
        if (s.length() > 0) {
            countries.clear();
            String readTwitterFeed = readFeed(s.toString());
            System.out.println(readTwitterFeed);
            try {
                JSONObject menuObject = new JSONObject(readTwitterFeed);
                JSONArray menuitemArray = menuObject
                        .getJSONArray("objectNameList");
                for (int i = 0; i < menuitemArray.length(); i++) {
                    System.out.println(menuitemArray.get(i));
                    countries.add(menuitemArray.get(i).toString());
                }
                // adapter.notifyDataSetChanged();
                // adapter.setNotifyOnChange(true);
                // textView.setAdapter(adapter);
                // textView.setThreshold(1);
                // textView.setAdapter(adapter);
                // textView.showDropDown();
                // adapter.setNotifyOnChange(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

public String readFeed(String val) {

    StringBuilder builder = new StringBuilder();
    HttpClient client = new DefaultHttpClient();
    HttpGet httpGet = new HttpGet(
            url);
    try {
        HttpResponse response = client.execute(httpGet);
        StatusLine statusLine = response.getStatusLine();
        int statusCode = statusLine.getStatusCode();
        if (statusCode == 200) {
            System.out.println("200");
            HttpEntity entity = response.getEntity();
            InputStream content = entity.getContent();
            BufferedReader reader = new BufferedReader(
                    new InputStreamReader(content));
            String line;
            while ((line = reader.readLine()) != null) {
                builder.append(line);
            }
        } else {
            System.out.println("else block");
            Log.e(HelloAutoCompleteActivity.class.toString(),
                    "Failed to download file");
        }
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return builder.toString();
}

}

2 个答案:

答案 0 :(得分:4)

您也可以使用Filter接口来实现此功能。事实证明,Filter.performFiltering()仅在此类目的的情况下从UI线程调用。以下是我用来执行此操作的一些代码:

 Filter filter = new Filter() {

    @Override
    public CharSequence convertResultToString(Object resultValue) {
        return resultValue.toString();
    }

    @Override
    protected FilterResults performFiltering(CharSequence charSequence) {
        if( charSequence == null ) return null;
        try {
            // This call hits the server with the name I'm looking for and parses the JSON returned for the first 25 results
            PagedResult results = searchByName( charSequence.toString(), 1, 25, true);
            FilterResults filterResults = new FilterResults();
            filterResults.values = results.getResults();
            filterResults.count = results.getResults().size();
            return filterResults;
        } catch (JSONException e) {
            return new FilterResults();
        }
    }

    @Override
    protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
        if( filterResults != null ) {
            adapter.clear();
            adapter.addAll( (List<MyObject>)filterResults.values );
        }
    }
};

然后使用过滤器:

    private AutoCompleteTextView beverageName;
    ...

    beverageName = findViewById( R.id.beverageName );
    ListAdapter adapter = ...
    adapter.setFilter(filter);
    beverageName.setAdapter(adapter);

或者您也可以使用此链接

http://www.grobmeier.de/android-autocomplete-with-json-data-served-by-struts-2-05122011.html

答案 1 :(得分:3)

我不知道您使用什么JSON来解析。但这是使用Wikipedia Suggest JSON动态自动完成的示例。您需要做的就是更改JSON部件。

package com.yourapplication.wiki;

import java.util.ArrayList;
import java.util.List;

import org.apache.http.client.HttpClient;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;

public class WikiSuggestActivity extends Activity {
    public String data;
    public List<String> suggest;
    public AutoCompleteTextView autoComplete;
    public ArrayAdapter<String> aAdapter;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        suggest = new ArrayList<String>();
        autoComplete = (AutoCompleteTextView) findViewById(R.id.autoCompleteTextView1);
        autoComplete.addTextChangedListener(new TextWatcher(){

            public void afterTextChanged(Editable editable) {
                // TODO Auto-generated method stub

            }

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

            }

            public void onTextChanged(CharSequence s, int start, int before, int count) {
                String newText = s.toString();
                new getJson().execute(newText);
            }

        });

    }
   class getJson extends AsyncTask<String,String,String>{

    @Override
    protected String doInBackground(String... key) {
        String newText = key[0];
        newText = newText.trim();
        newText = newText.replace(" ", "+");
        try{
            HttpClient hClient = new DefaultHttpClient();
            HttpGet hGet = new HttpGet("http://en.wikipedia.org/w/api.php?action=opensearch&search="+newText+"&limit=8&namespace=0&format=json");
            ResponseHandler<String> rHandler = new BasicResponseHandler();
            data = hClient.execute(hGet,rHandler);
            suggest = new ArrayList<String>();
            JSONArray jArray = new JSONArray(data);
            for(int i=0;i<jArray.getJSONArray(1).length();i++){
            String SuggestKey = jArray.getJSONArray(1).getString(i);
            suggest.add(SuggestKey);
            }

        }catch(Exception e){
            Log.w("Error", e.getMessage());
        }
        runOnUiThread(new Runnable(){
            public void run(){
                 aAdapter = new ArrayAdapter<String>(getApplicationContext(),R.layout.item,suggest);
                 autoComplete.setAdapter(aAdapter);
                 aAdapter.notifyDataSetChanged();
            }
        });

        return null;
    }

   }
}

希望它有所帮助谢谢!