AutoCompleteTextView 不响应对其 ArrayAdapter 的更改 [英] AutoCompleteTextView not responding to changes to its ArrayAdapter

查看:24
本文介绍了AutoCompleteTextView 不响应对其 ArrayAdapter 的更改的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

ArrayList 似乎填充得很好,但无论我使用什么方法,我似乎都无法让适配器填充数据.我曾尝试添加到 ArrayList,也添​​加到 ArrayAdapter.无论哪种方式,我都无法在 AutoCompleteTextView 级别或 ArrayAdapter 本身获得响应(当然 AutoCompleteTextView 什么都不做).任何人都可以看到有什么问题吗?

The ArrayList appears to be populating just fine, but no matter what approach I use, I can't seem to get the adapter to populate with data. I have tried adding to the ArrayList, also to the ArrayAdapter. Either way I am unable to get a response at the AutoCompleteTextView level, or in the ArrayAdapter itself(and of course the AutoCompleteTextView is doing nothing). Can anybody see what's wrong?

public class MainActivity extends Activity implements TextWatcher {
// private AutoCompleteView autoComplete; 
public String TAG = new String("MAINACTIVITY");
public ArrayAdapter<String> autoCompleteAdapter;
public AutoCompleteTextView autoComplete;
public InputStream inputStream;
public List<String> data;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    data = new ArrayList<String>();
    autoCompleteAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_dropdown_item_1line, data);
    autoCompleteAdapter.setNotifyOnChange(true);
    autoComplete = (AutoCompleteTextView) findViewById(R.id.acsayt);
    autoComplete.setHint(R.string.search_hint);
    autoComplete.setThreshold(2);
    autoComplete.addTextChangedListener(this);
    autoComplete.setAdapter(autoCompleteAdapter);
}

// uphold TextWatcher interface methods
public void afterTextChanged(Editable s) {
}
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}

public void onTextChanged(CharSequence s, int start, int before, int count) {
    Log.d(TAG, "I detected a text change " + s.toString());
    data.clear();
    queryWebService();
}

private void queryWebService() {
    new Thread(new Runnable() {
        public void run() {
            Log.d(TAG, "spawned thread");

            //  Code in here to set up http connection, query webservice ...

            // parse the JSON response & add items to adapter
            try {
                JSONArray jArray = new JSONArray(resultString);
                int length = jArray.length();
                int countedValues, capturedValues;
                Log.d(TAG, "response had " + length + " items");
                int i = 0;
                while (i < length) {
                    JSONObject internalObject = jArray.getJSONObject(i);
                    String vehicleName = internalObject.getString("name").toString();
                    Log.d(TAG, "vehicle name is " + vehicleName);
                    try {
                        data.add(vehicleName);  
                        autoCompleteAdapter.add(vehicleName);   // not working
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    countedValues = data.size();    // correctly reports 20 values
                    capturedValues = autoCompleteAdapter.getCount();    //  is zero
                    Log.d(TAG, "array list holds " + countedValues + " values");
                    Log.d(TAG, "array adapter holds " + capturedValues + " values");
                    i++;
                }
            } catch (Exception e) {
                Log.d(TAG, "JSON manipulation err: " + e.toString());
            }
        }
    }).start();
}

}

LogCat 显示来自 data.size() 的预期值数量,但来自 autoCompleteAdapter.getCount() 的值为零.

LogCat shows the expected number of values from data.size(), but zero from autoCompleteAdapter.getCount().

推荐答案

ArrayList 似乎填充得很好,但无论如何我使用的方法,我似乎无法让适配器填充数据

The ArrayList appears to be populating just fine, but no matter what approach I use, I can't seem to get the adapter to populate with data

您反对 AutoCompleTextView 的工作方式.当用户开始在输入框中输入字符时,AutoCompleteTextView 将过滤适配器,当发生这种情况时,它将显示包含设法通过过滤器请求的值的下拉列表.现在您已经设置 AutoCompleteTextView 以在每次用户输入字符时创建一个线程,问题是 AutoCompleteTextview 永远不会看到这些值,因为它请求适配器在适配器实际填充正确值之前进行过滤.尝试这样的事情:

You're going against how the AutoCompleTextView works. When the user starts entering characters in the input box the AutoCompleteTextView will filter the adapter and when that happens it will show the drop down with the values which managed to pass the filter request. Now you've setup the AutoCompleteTextView to make a thread each time the user enters a character, the problem is that the AutoCompleteTextview will never see those values as it requests the adapter to filter before the adapter actually gets populated with the right values. try something like this:

public static class BlockingAutoCompleteTextView extends
        AutoCompleteTextView {

    public BlockingAutoCompleteTextView(Context context) {
        super(context);
    }

    @Override
    protected void performFiltering(CharSequence text, int keyCode) {           
        // nothing, block the default auto complete behavior
    }

}

并获取数据:

public void onTextChanged(CharSequence s, int start, int before, int count) {
    if (autoComplete.getThreashold() < s.length()) {
        return;
    } 
    queryWebService();
}

您需要更新主 UI 线程上的数据并使用适配器的方法:

You need to update the data on the main UI thread and also using the adapter's methods:

// do the http requests you have in the queryWebService method and when it's time to update the data:
runOnUiThread(new Runnable() {
        @Override
    public void run() {
        autoCompleteAdapter.clear();
        // add the data
                for (int i = 0; i < length; i++) {
                     // do json stuff and add the data
                     autoCompleteAdapter.add(theNewItem);                    
                } 
                // trigger a filter on the AutoCompleteTextView to show the popup with the results 
                autoCompleteAdapter.getFilter().filter(s, autoComplete);
    }
});

看看上面的代码是否有效.

See if the code above works.

这篇关于AutoCompleteTextView 不响应对其 ArrayAdapter 的更改的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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