2015-08-25 2 views
0

Следующий поток App показывает, что я ожидал («Альфа» в списке автозаполнения):AutoCompleteTextView не обновляет arrayadapter элементов

Open App -> нажмите на кнопку -> нажмите на автозаполнения поле -> тип «аль "

Но это один выходит из строя (и если я типа„бр“,„Браво“по-прежнему в списке):

Open App -> нажмите на автозаполнения поле -> напечатать что угодно, а затем удалить его -> нажмите на кнопку -> коснитесь поля автозаполнения -> тип "al"

Почему список i s не обновляется во второй последовательности?

public class DisplayFragment extends Fragment { 

AutoCompleteTextView autoCTVShop; 
Button buttonSend; 

String[] names= {"Bravo","Charlie","Delta","Foxtrot"}; 
ArrayAdapter<String> adapter; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) {    
    return inflater.inflate(R.layout.fragment_display, container, false); 
} 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 

    autoCTVShop = (AutoCompleteTextView) getActivity().findViewById(R.id.autoCompleteTextViewShop); 
    adapter = new ArrayAdapter<String>(getActivity().getApplicationContext(), 
      android.R.layout.simple_list_item_1, names); 
    autoCTVShop.setAdapter(adapter); 
    buttonSend = (Button) getActivity().findViewById(R.id.buttonSend); 
    buttonSend.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      //The following two lines don't work as I expected 
      names[0]="Alfa"; 
      adapter.notifyDataSetChanged(); 
     } 
    }); 
} 


@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
} 
} 

fragment_display.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

<AutoCompleteTextView 
    android:id="@+id/autoCompleteTextViewShop" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:ems="10" 
    android:imeOptions="actionNext" 
    android:singleLine="true" /> 

<Button 
    android:id="@+id/buttonSend" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:clickable="true" 
    android:enabled="true" 
    android:text="Button" /> 

</LinearLayout> 

Спасибо.

ответ

2

Внутренне ArrayAdapter использует 2 списка для хранения и обработки предметов. Первоначально ваши переданные элементы хранятся и обрабатываются через список с именем mObjects. Любые изменения на вашем внешнем объекте names будут отражены в списке mObjects.

Как только вы начнете фильтровать, создается второй список с именем . Во время фильтрационного потока mObjects будет использоваться в качестве контейнера «текущие значения», а используется как контейнер «перезагрузки и повторного фильтра». Изменение значений names больше не будет иметь никакого влияния. Вы можете напрямую изменить значения адаптера (adapter.insert (...), adapter.remove (...) - он изменит) или заново создаст адаптер

+0

Спасибо, @ N.T. Очень четкое объяснение. – Javier

0

Я уверен, что это чувствительный к регистру. Попробуй ... это может быть так. Также может быть, потому что вы заменяете имена. Я не уверен, но когда вы проходите через имена, это может быть установка экземпляра var, который не будет обновляться одновременно. поэтому вам нужно будет повторно пройти через массив.

+0

Спасибо WIll, но, как я уже сказал, первая последовательность шагов показывает правильное имя (Alfa). Вопрос в том, почему вторая последовательность шагов не показывает то же самое. – Javier

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