android - 从 afterTextChanged() 更新适配器

标签 android android-adapter autocompletetextview

问题是 adapter 设置后我无法更新。对于第一个字符,它工作正常,但如果我想更改它,adapter 会继续查看相同的建议。如何更新适配器? 这是我的代码。

public class UzActivity extends Activity  {

private static final String DEBUG_TAG = "HttpExample";
List<String> responseList;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_uz);
    responseList = new ArrayList<String>();

    final String url = "http://booking.uz.gov.ua/purchase/station/";

    final AutoCompleteTextView textView = (AutoCompleteTextView)
            findViewById(R.id.autoCompleteTextView1);

    final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_dropdown_item_1line, responseList);


    textView.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

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

        }

        @Override
        public void afterTextChanged(Editable s) {

            if (s.length()>0 && responseList.isEmpty()){

                try {
                    new FetchStationTask().execute(url + URLEncoder.encode(s.toString(), "UTF-8"));
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
                textView.setAdapter(adapter);
            }

            else if(s.length()==0){
                responseList.clear();
            }
        }
    });
}



private class FetchStationTask extends AsyncTask<String, Void, String>{

    @Override
    protected String doInBackground(String... urls) {
        try {
            return new UzFetcher().getUrlString(urls[0]);
        } catch (IOException e) {
            return "Unable to retrieve web page. URL may be invalid.";
        }
    }

    @Override
    protected void onPostExecute(String result){

        try {
            ObjectMapper objectMapper = new ObjectMapper();
            objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
            StationResponse st = objectMapper.readValue(result, StationResponse.class);
            for (int i = 0; i<st.mStations.size(); i++){
                    responseList.add(st.mStations.get(i).getTitle());
            }


            Log.i(DEBUG_TAG, responseList.get(0));
        } catch (IOException e) {
            e.printStackTrace();
        }
        Log.i(DEBUG_TAG, result);

    }
}

最佳答案

你试过了吗notifyDataSetChangedadapter.notifyDataSetChanged() 而不是 textView.setAdapter(adapter)

你也有行 if (s.length()>0 && responseList.isEmpty()) 但是当你输入第一个数字时,适配器可能不为空,第二个条件 if (s.length()==0) 为假

关于android - 从 afterTextChanged() 更新适配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29668934/

相关文章:

Android:使用自定义适配器设置 AutoCompleteTextView

java - 动态填充 AutoCompleteTextView 建议

android - Monkeyrunner.sleep() 发送新闻事件总是出错

Android:根据设备的当前时间格式更改时间格式

android - ListView 在屏幕方向更改时在列表中添加了重复项

java - 从对象数据库生成列表

android - 在回收站 View 中的特定位置更新 View

android - 如何将数据从一个应用程序发送到android中的另一个应用程序?

android - 在android中创建动态列表?

java - 使用自动完成功能进行 Json 解析