2015-04-16 3 views
1

Проблема в том, что я не могу обновить adapter после того, как он был установлен. Для первого символа он отлично работает, но если я хочу его изменить, то adapter продолжает просматривать те же предложения. Как я могу обновить adapter? Вот мой код.Обновление адаптера после afterTextChanged()

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); 

    } 
} 

ответ

0

Вы пытались notifyDataSetChanged? adapter.notifyDataSetChanged() вместо textView.setAdapter(adapter).

также у вас есть линия if (s.length()>0 && responseList.isEmpty()), но когда вы кладете первую цифру, вероятно, адаптер не является пустым, а также второе условие if(s.length()==0) ложна

+0

Да, я пытался, но он не работает. Может быть, мне нужно настроить adater в asynctask? – lopoly

+0

вы должны настроить свой адаптер в 'onPostExecute' с' notifyDataSetChanged' под целым 'try..catch'. вы также можете использовать фильтрацию, если она соответствует вашим целям [(пример здесь)] (http://stackoverflow.com/questions/5780289/filtering-listview-with-custom-object-adapter) – snachmsm

1
  • Пожалуйста, сообщите адаптер в onPostExecute (строка результата) метод {}.
onPostExecute(String result){ 
    adapter.notifyDataSetChanged(); 
} 
Смежные вопросы