ListView ne se met pas à jour tant que le clavier n'est pas caché

J'ai un DialogFragment et dans sa mise en page, j'ai un EditText et un ListView . La Liste affiche essentiellement la liste des contacts (Initialement, cette liste comporte 0 éléments). Lorsque la edittext de edittext est mise à jour, je edittext la liste avec des contacts contenant le text saisi dans EditText .

Sur EditText j'ai utilisé un addTextChangedListener pour mettre à jour la liste avec les contacts souhaités lorsque l'utilisateur addTextChangedListener un nom ou une adresse électronique du contact.

  • Problème VideoView Android 2.2
  • L'application Android se bloque après la version de mise à jour des outils SDK (NoClassDefFound, outil version 22)
  • Comment mettre à jour la barre de progression dans un élément ListView
  • Comment ajouter la clause WHERE à la requête sur Android
  • Android Clear Webview thread, mémoire gratuite, éviter OutOfMemoryError
  • Erreur: échec d'exécution pour la tâche ': application: buildInfo Debug Loader'
  • Le problème étrange auquel je suis confronté est que la liste (ou peut-être la mise en page) n'est mise à jour que lorsque j'appuie sur le bouton Précédent pour cacher le clavier après la saisie. Tant que le clavier programmable affiche la liste n'est pas mise à jour (sauf pour la première fois lorsque des éléments sont ajoutés à la liste vide).

    Voici une partie du code pour une meilleure compréhension.

    CustomDialogFragment.java

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

    In 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(); } 

    Mon hypothèse est que la liste de l'adaptateur de liste est correctement mise à jour, mais en raison de la raison pour laquelle la mise en page ne reflète pas les nouvelles modifications jusqu'à ce que le clavier logiciel soit caché.

    Des questions:

    • Quelqu'un a-t-il déjà eu un problème similaire? (Impossible de trouver des ressources lors du google: /)?
    • Pourquoi cela se produit-il?
    • Y a-t-il quelque chose qui soit lié à cela dans les documents officiels?
    • Quelle est la meilleure façon de résoudre ce problème?

    PS: le code dans la méthode afterTextChanged était précédemment dans la méthode onTextChanged et je rencontrais le même problème.

    UPDATE (Ajout de captures d'écran pour une meilleure compréhension)

    1. Ce qui suit est le moment où le fragment de dialogue est affiché et aucun texte n'a été tapé dans le fichier edittext. C'est alors que le fragment de dialogue est affiché

    2. Maintenant, lorsque j'écris "A" et que la liste génère. Entrez la description de l'image ici

    3. J'ajoute quelques lettres mais la liste ne se met pas à jour. J'ai ajouté des lettres "mit" alors la requête devient "Amit" mais aucune modification dans la liste. Entrez la description de l'image ici

    4. Maintenant, lorsque j'appuie sur le bouton arrière du matériel sur le périphérique pour cacher le clavier. Le clavier est masqué et la liste est mise à jour. Entrez la description de l'image ici

    (Ne craignez pas les noms et les courriels de contacts superposés, vous devez encore réparer la mise en page: P)

    UPDATE2 (Ajout du code EmailContactAdapter)

    Voici la classe 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; } } 

  • Comment ajouter des paramètres à une requête HTTP GET dans Android?
  • Android, fournisseur de contenu dans le projet de bibliothèque
  • Comment centrer l'image verticalement dans ce RelatifLayout
  • Qu'est-ce que Uri.parse dans Android
  • Android twitter4j télécharger l'image
  • La classe n'est pas abstraite et ne remplace pas la méthode abstraite surClick (View) dans OnClickListener
  • 3 Solutions collect form web for “ListView ne se met pas à jour tant que le clavier n'est pas caché”

    Vous essayez de modifier la liste visible avec la modification des emailContacts , mais l'adaptateur contient toujours les anciennes données de liste.

    Solution: après chaque nouveau texte dans EditText créez une nouvelle carte (est très Mauvaise) ou créez une méthode dans EmailContactAdapter pour remplacer les éléments – dans le champ contacts votre cas.

    Dans le code ci-dessous, vous gérez la liste avec le résultat de commonMethods.getEmailContacts

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

    Vous devez d'abord faire un emailContacts.Clear() sinon la liste ne changera pas?

    Essayez de supprimer tout emailContacts.clear (); . Ensuite, ajoutez emailContacts.clear (); Juste avant emailContacts.addAll (commonMethods.getEmailContacts (appContext, textValue)); . Vous ajoutez votre liste pour chaque lettre que vous avez tapée.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.