ListView wird erst aktualisiert, wenn die Tastatur ausgeblendet ist

Ich habe einDialogFragment und in seinem Layout habe ich einEditText und einListView. In der Listenansicht wird im Wesentlichen die Liste der Kontakte angezeigt (zu Beginn enthält diese Liste 0 Elemente). Wenn dieedittexter Wert von @ wird aktualisiert. Ich fülle die Liste mit Kontakten mit demtext in das @ eingegebEditText.

Auf derEditText Ich habe ein @ verwendaddTextChangedListener, um die Liste mit den gewünschten Kontakten zu aktualisieren, während der Benutzer einen Namen oder eine E-Mail-Adresse des Kontakts eingibt.

Das seltsame Problem besteht darin, dass die Liste (oder vielleicht das Layout) nur aktualisiert wird, wenn ich die Zurück-Taste drücke, um die Tastatur nach dem Tippen auszublenden. Solange die Softtastatur angezeigt wird, wird die Liste nicht aktualisiert (außer zum ersten Mal, wenn der leeren Liste Elemente hinzugefügt werden).

Folgen ist ein Teil des Codes zum besseren Verständnis.

CustomDialogFragment.java

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

Ich gehe davon aus, dass die Liste des Listenadapters korrekt aktualisiert wurde, aber aus irgendeinem Grund werden die neuen Änderungen erst im Layout berücksichtigt, wenn die Softtastatur ausgeblendet ist.

Fragen

Hat jemand ein ähnliches Problem vor (Konnte keine Ressourcen beim googeln finden: /)?Warum passiert das Ist diesbezüglich in den offiziellen Dokumenten etwas vermerkt? Was ist der beste Weg, um dieses Problem zu lösen?

PS: Der Code imafterTextChanged Methode war zuvor in deronTextChanged Methode und ich standen vor dem gleichen Problem.

AKTUALISIERE (Screenshots zum besseren Verständnis hinzugefügt)

Das Folgende ist, wenn das Dialogfragment angezeigt wird und im Edittext kein Text eingegeben wurde.

Jetzt, wenn ich "A" eingebe und die Liste aufgefüllt wird.

Ich füge noch ein paar Buchstaben hinzu, aber die Liste wird nicht aktualisiert. Ich habe die Buchstaben "mit" hinzugefügt, so dass die Abfrage jetzt "Amit" wird, aber keine Änderung in der Liste.

Jetzt, wenn ich die Hardware-Zurück-Taste am Gerät drücke, um die Tastatur auszublenden. Die Tastatur wird ausgeblendet und die Liste aktualisiert.

(Bitte beachten Sie die überlappenden Kontaktnamen und E-Mails, das Layout muss noch korrigiert werden: P)

UPDATE2 (EmailContactAdapter-Code hinzufügen)

Following ist die EmailContactAdapter-Klasse

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;
}
}

Antworten auf die Frage(6)

Ihre Antwort auf die Frage