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();
}
Я предполагаю, что список адаптера списка корректно обновляется, но по какой-то причине макет не отражает новые изменения, пока программная клавиатура не будет скрыта.
Вопросы:
Кто-нибудь сталкивался с подобной проблемой раньше (Не удалось найти какие-либо ресурсы во время поиска в Google: /)?Почему это происходит?Есть ли что-нибудь связанное с этим в официальных документах?Какой лучший способ решить эту проблему?PS: код вafterTextChanged
Метод был ранее вonTextChanged
метод, и я столкнулся с той же проблемой.
ОБНОВИТЬ (Добавлены скриншоты для лучшего понимания)
Далее следует, когда отображается фрагмент диалога, и текст редактирования не был набран в тексте редактирования.
Теперь, когда я набираю «А» и список заполняется.
Я добавляю еще несколько букв, но список не обновляется. Я добавил буквы "mit", так что теперь запрос становится "Amit", но никаких изменений в списке.
Теперь, когда я нажимаю аппаратную кнопку возврата на устройстве, чтобы скрыть клавиатуру. Клавиатура скрыта, и список обновляется.
(Пожалуйста, не обращайте внимания на перекрывающиеся имена контактов и электронные письма, все равно придется исправлять макет: 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;
}
}