ListView не обновляется до тех пор, пока клавиатура не будет скрыта

У меня есть DialogFragment и в его макете есть EditText и ListView . В Listview в основном отображается список контактов (изначально этот список содержит 0 элементов). Когда значение edittext обновляется, я заполняю список контактами, у которых есть text набранный в EditText .

В EditText я использовал addTextChangedListener для обновления списка с нужными контактами, поскольку пользователь вводит имя или адрес электронной почты контакта.

Странная проблема, с которой я сталкиваюсь, заключается в том, что список (или, может быть, макет) обновляется, только когда я нажимаю кнопку «Назад», чтобы скрыть клавиатуру после ввода. Пока отображается мягкая клавиатура, список не обновляется (за исключением первого раза, когда элементы добавляются в пустой список).

Ниже приведен некоторый код для лучшего понимания.

CustomDialogFragment.java

(В onCreateView):

  // Set list adapter for contacts list contactsList = (ListView) shareView.findViewById(R.id.contactList); emailContactAdapter = new EmailContactAdapter(getActivity(), emailContacts, shareFragment); contactsList.setAdapter(emailContactAdapter); // Implement Phone-book contact share sendToInput = (EditText) shareView.findViewById(R.id.contact_name); sendToInput.addTextChangedListener(onContactNameSearch); 

В onContactNameSearch (TextWatcher):

 public TextWatcher onContactNameSearch = new TextWatcher() { private generics commonMethods = new generics(); @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { emailContacts.clear(); } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void afterTextChanged(Editable s) { Log.d("DEBUG::REACH", "After Text Changed called"); String textValue = s.toString(); // Show or hide the share apps list based on user input // and whether or not the list is already showing or not if (textValue.equals("")) { Log.d("DEBUG::REACH", "TEXT value is empty"); showAppList(); emailContacts.clear(); } else { Log.d("DEBUG::REACH", "TEXT has value"); // Hide app list if visible if (isAppListShowing()) hideAppList(); // Get the email contacts list based on the user query emailContacts.addAll(commonMethods.getEmailContacts(appContext, textValue)); } adapter.notifyDataSetChanged(); } 

Мое предположение заключается в том, что список адаптеров списка правильно обновлен, но по какой-то причине макет не отражает новые изменения до тех пор, пока скрытая клавиатура не будет скрыта.

Вопросов:

  • Кто-нибудь сталкивался с подобной проблемой раньше (не удалось найти какие-либо ресурсы во время поиска: /)?
  • Почему это происходит?
  • Есть ли что-то связанное с этим в официальных документах?
  • Каков наилучший способ решить эту проблему?

PS: Код в методе afterTextChanged ранее был в методе onTextChanged и я столкнулся с той же проблемой.

UPDATE (добавлены скриншоты для лучшего понимания)

  1. Ниже показан фрагмент диалога и текст в редакторе не вводится. Это когда отображается фрагмент диалога

  2. Теперь, когда я набираю «А», и список заполняется. Введите описание изображения здесь

  3. Я добавляю еще несколько букв, но список не обновляется. Я добавил буквы «mit», поэтому теперь запрос становится «Amit», но без изменений в списке. Введите описание изображения здесь

  4. Теперь, когда я нажимаю кнопку аппаратного возврата на устройстве, чтобы скрыть клавиатуру. Клавиатура скрыта и список обновлен. Введите описание изображения здесь

(Пожалуйста, не обращайте внимания на совпадающие имена контактов и электронные письма, все еще нужно исправить макет: P)

UPDATE2 (добавление кода EmailContactAdapter)

Ниже приведен класс EmailContactAdapter

 public class EmailContactAdapter extends BaseAdapter { private Activity activity; private ArrayList<EmailContact> contacts; private ProductShareFragment fragment; private LayoutInflater inflater; /** * Constructor */ public EmailContactAdapter(Activity activity, ArrayList<EmailContact> contacts, ProductShareFragment fragment) { this.activity = activity; this.contacts = contacts; this.fragment = fragment; } @Override public int getCount() { return contacts.size(); } @Override public Object getItem(int position) { return contacts.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { if (inflater == null) { inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } if (convertView == null) { convertView = inflater.inflate(R.layout.email_contact_list_row, null); } EmailContact contact = contacts.get(position); ImageView contactImage = (ImageView) convertView.findViewById(R.id.email_contact_image); TextView contactName = (TextView) convertView.findViewById(R.id.email_contact_name); TextView contactEmail = (TextView) convertView.findViewById(R.id.email_contact_email); // contactImage.setImageBitmap(contact.getImage()); contactName.setText(contact.getName()); contactEmail.setText(contact.getEmail()); return convertView; } } 

Вы пытаетесь изменить видимый список при изменении emailContacts , но адаптер все еще содержит старые данные списка.

Решение: после каждого нового текста в EditText создайте новый адаптер (это очень плохо) или создайте метод в EmailContactAdapter для замены элементов – в поле contacts вашего случая.

В приведенном ниже коде вы commonMethods.getEmailContacts список результатом commonMethods.getEmailContacts

 // Get the email contacts list based on the user query emailContacts.addAll(commonMethods.getEmailContacts(appContext, textValue)); 

Конечно, вам сначала нужно сделать emailContacts.Clear() иначе список не изменится?

Попробуйте удалить все emailContacts.clear (); , Затем добавьте emailContacts.clear (); Непосредственно перед emailContacts.addAll (commonMethods.getEmailContacts (appContext, textValue)); , Вы добавляете свой список для каждой введенной буквы.