2014-02-19 5 views
0

Я использую Geocoder для получения совпадающих адресов от String.Android AutoCompleteTextView Refreshing

Я пытаюсь отобразить возвращенные адреса в AutoCompleteTextView.

я могу увидеть значение правильно, когда я Log.i("Result:"," "+list_of_addresses);

Поскольку речь идет о динамическом списке загрузке Я зову adapter.NotifyDataSetChanged();

Я использую addTextChangedListener слушать изменения в вводе текста пользователя

Это то, что код выглядит

public class Map extends Activity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.map); 

    final Geocoder gc = new Geocoder(getApplicationContext(), Locale.getDefault()); 
    final ArrayList<String> address_name = new ArrayList<String>(); 
    final AutoCompleteTextView search = (AutoCompleteTextView) findViewById(R.id.search); 

    search.setThreshold(1); 
    final ArrayAdapter<String> adapter =new ArrayAdapter<String>(this, 
      android.R.layout.simple_dropdown_item_1line,address_name); 

    search.setAdapter(adapter); //moved this line out of the try block 

    search.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void afterTextChanged(Editable s) { 
      List<Address> list = null; 
      Address address = null; 
      try { 
       list = gc.getFromLocationName(s.toString(), 10); 
       Log.i("List:", ""+list); //CAN see this log 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      for(int i=0; i<list.size(); i++){ 

        address = list.get(i); 
        address_name.add(address.getFeatureName().toString()); 
        Log.i("Address: ", address.getFeatureName().toString()); //CANto see this Log 

      } 
      if(!list.isEmpty()){ 
       list.clear(); 
      } 
      adapter.notifyDataSetChanged(); 
      search.showDropDown(); 
     } 

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

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

Внутри цикл я не могу увидеть log.i("Addresses:",address.getFeatureName.toString());

Но когда я изменить для условия цикла к i<=list.size() я получаю выход журнала, но в forcecloses приложения с этой ошибкой java.lang.IndexOutOfBoundsException: Invalid index 10, size is 10

Может быть, поэтому я не удалось увидеть список адресов?

EDIT: Я изменил для условия цикла к i<list.size() также добавил search.showDropDown() после уведомления набора данных изменилась.

Любая помощь будет оценена! Спасибо.

+0

изменение состояние до ** i <список.size() ** –

+0

@kalyanpvs сделано! Благодарю. добавлено, что условие также произвело некоторые изменения, такие как добавление search.showDropDown(); проверить правку в OP – user2933671

ответ

0

У вас, похоже, проблема с его работой. Я вставлю то, что работает для меня очень хорошо, только соответствующие разделы для автозаполнения.

OnCreate

pickUpAutoComplete = new AutoComplete(this, R.layout.pickupautocomplete); 
pickUpAutoComplete.setNotifyOnChange(true); 
locationText = (AutoCompleteTextView) findViewById(R.id.locationText); 
locationText.setOnItemClickListener(this); 
locationText.setOnFocusChangeListener(this); 
locationText.setAdapter(pickUpAutoComplete); 

расположение XML

<AutoCompleteTextView 
     android:id="@+id/locationText" 
     style="@style/registerLargestTextSize" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_gravity="center" 
     android:layout_margin="10dp" 
     android:layout_weight="6" 
     android:background="#ffffff" 
     android:completionThreshold="3" 
     android:focusable="true" 
     android:gravity="center" 
     android:hint="home location" 
     android:lines="3" 
     android:maxLines="3" 
     android:minLines="3" 
     android:paddingBottom="3dp" 
     android:paddingLeft="6dp" 
     android:paddingRight="6dp" 
     android:scrollbarAlwaysDrawVerticalTrack="true" 
     android:scrollbarStyle="outsideOverlay" 
     android:textColor="#b2b2b2" 
     android:textStyle="bold" /> 

автозаполнения Класс, Не забудьте заменить ваш API KEY

public class AutoComplete extends ArrayAdapter<String> implements Filterable { 
    private static final String LOG_TAG = "carEgiri"; 

    private static final String PLACES_API_BASE = "https://maps.googleapis.com/maps/api/place"; 
    private static final String TYPE_AUTOCOMPLETE = "/autocomplete"; 
    private static final String OUT_JSON = "/json"; 

    private static final String API_KEY = "**YOUR API KEY HERE**"; 

    private ArrayList<String> resultList; 

    public AutoComplete(IPostAutoCompleteUIChange context, 
      int textViewResourceId) { 
     super((Context) context, textViewResourceId); 
    } 

    @Override 
    public int getCount() { 
     if (resultList == null) 
      return 0; 
     return resultList.size(); 
    } 

    @Override 
    public String getItem(int index) { 
     return resultList.get(index); 
    } 

    @Override 
    public Filter getFilter() { 
     Filter filter = new Filter() { 
      @Override 
      protected FilterResults performFiltering(CharSequence constraint) { 
       FilterResults filterResults = new FilterResults(); 
       if (constraint != null) { 
        // Retrieve the autocomplete results. 
        resultList = autocomplete(constraint.toString()); 

        // Assign the data to the FilterResults 
        filterResults.values = resultList; 
        filterResults.count = resultList.size(); 
       } 
       return filterResults; 
      } 

      @Override 
      protected void publishResults(CharSequence constraint, 
        FilterResults results) { 
       if (results != null && results.count > 0) { 
        notifyDataSetChanged(); 
       } else { 
        notifyDataSetInvalidated(); 
       } 
      } 
     }; 
     return filter; 
    } 
0

Проблема связана с неправильным или пустым переопределения методов адаптера:

@Override 
public UPorPackageItem getItem(int index) { 
    return mValues.get(index); 
} 

@Override 
public int getCount() { 
    if (mValues == null) 
     return 0; 
    return mValues.size(); 
} 

вы должны реализовать описанный выше способ. Будет работать

Смежные вопросы