web-dev-qa-db-fra.com

Afficher tous les éléments dans AutocompleteTextView sans écrire de texte

J'ai un AutocompleteTextView et cela fonctionne bien. Lorsque j'écris un mot, il affiche le résultat pertinent, mais je souhaite afficher tous les éléments sans écrire de mot dans AutocompleteTextView. Comment puis je faire ça. 

40
androidcodehunter

Vous devez étendre AutoCompleteTextView, 

"Lorsque le seuil est inférieur ou égal à 0, un seuil de 1 est Appliqué.".

setThreshold

import Android.content.Context;  
import Android.graphics.Rect;
import Android.util.AttributeSet;
import Android.widget.AutoCompleteTextView;

public class InstantAutoComplete extends AutoCompleteTextView {

    public InstantAutoComplete(Context context) {
        super(context);
    }

    public InstantAutoComplete(Context arg0, AttributeSet arg1) {
        super(arg0, arg1);
    }

    public InstantAutoComplete(Context arg0, AttributeSet arg1, int arg2) {
        super(arg0, arg1, arg2);
    }

    @Override
    public boolean enoughToFilter() {
        return true;
    }

    @Override
    protected void onFocusChanged(boolean focused, int direction,
            Rect previouslyFocusedRect) {
        super.onFocusChanged(focused, direction, previouslyFocusedRect);
       if (focused && getFilter()!=null) {
        performFiltering(getText(), 0);
    }
    }

}

en xml 

<AutoCompleteTextView ... /> to <your.namespace.InstantAutoComplete ... />

EDIT 1

Créez une nouvelle classe nommée InstantAutoComplete, puis insérez ce code dans la classe. 

Dans votre mise en page XML, utilisez cette classe comme 

puis trouvez ce widget dans votre activité (méthode onCreate).

Regardez cet exemple

71
Talha

MEILLEURE SOLUTION ICI

Vous n'avez pas besoin de personnaliser votre AutoCompleteTextView. Au lieu de cela, appelez simplement autoCompleteTextView.showDropDown() quand vous en avez besoin .....

38
Melbourne Lopes

Ça marche pour moi:

ajoutez à votre objet les méthodes d'événement suivantes:

    myView.setOnFocusChangeListener(new OnFocusChangeListener() {

        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (hasFocus)
                myView.showDropDown();

        }
    });

    myView.setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            myView.showDropDown();
            return false;
        }
    });
26
Ubirajara Erthal

Cela fonctionne parfaitement pour moi, c’est un moyen facile de résoudre le problème:

final ArrayAdapter<String> adapter = new ArrayAdapter<>(getContext(), Android.R.layout.simple_dropdown_item_1line, usernameLists);
etUsername.setThreshold(1);
etUsername.setAdapter(adapter);
etUsername.setOnTouchListener(new View.OnTouchListener() {

    @SuppressLint("ClickableViewAccessibility")
    @Override
    public boolean onTouch(View paramView, MotionEvent paramMotionEvent) {
        if (usernameLists.size() > 0) {
                // show all suggestions
                if (!etUsername.getText().toString().equals(""))
                    adapter.getFilter().filter(null);
                etUsername.showDropDown();
            }
        return false;
    }
});
8
Ho Luong

vous devez appeler requestFocus (); pour afficher le clavier sinon le clavier ne s'affiche pas.

méthode avec force afficher la liste déroulante.

autocomptv.setOnTouchListener(new OnTouchListener() {

        @SuppressLint("ClickableViewAccessibility")
        @Override
        public boolean onTouch(View paramView, MotionEvent paramMotionEvent) {
            // TODO Auto-generated method stub
            autocomptv.showDropDown();
            autocomptv.requestFocus();
            return false;
        }
    });
3
Hemant Shori

utilisez ceci :

 text.setOnTouchListener(new View.OnTouchListener(){


            @Override
            public boolean onTouch(View arg0, MotionEvent arg1) {
                // TODO Auto-generated method stub
                text.showDropDown();
                return false;
            }
            });
3
user6920004

Si d'autres solutions ne fonctionnent pas, essayez plutôt ceci. Popup est affiché toujours au clic.

   public class InstantAutoComplete extends AppCompatAutoCompleteTextView {

    public InstantAutoComplete(Context context) {
        super(context);
    }

    public InstantAutoComplete(Context arg0, AttributeSet arg1) {
        super(arg0, arg1);
    }

    public InstantAutoComplete(Context arg0, AttributeSet arg1, int arg2) {
        super(arg0, arg1, arg2);
    }

    @Override
    public boolean enoughToFilter() {
        return true;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            performClick();
        }
        return super.onTouchEvent(event);
    }

    @Override
    public boolean performClick() {
        if (getFilter() != null && !isPopupShowing()) {
            performFiltering(getText(), 0);
            showDropDown();
        }
        return super.performClick();
    }
}
0
Jan Moravec

Ici, une approche avec onclicklistener comme j'ai trouvé tat onTouch était un peu irritante lorsque j'essayais de faire défiler. mOccupation est la vue AutocompleteTextView en question.

    mOccupation=(AutoCompleteTextView) findViewById(R.id.actv_occupation);
    ArrayAdapter<String> occupationAdapter=new ArrayAdapter<String> 
    (NewClientActivity.this,
            Android.R.layout.simple_list_item_1,
            getResources().getStringArray(R.array.occupation_array));
    mOccupation.setAdapter(occupationAdapter);
    mOccupation.setKeyListener(null);
    mOccupation.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            //mOccupation.setText(null);
            ((AutoCompleteTextView) view).showDropDown();
            return;
        }
    });

J'ai réussi à tout mettre dans un Textinputlayout avec les spécifications XML suivantes:

<Android.support.design.widget.TextInputLayout
    Android:id="@+id/lo_occupation"
    Android:layout_marginTop="10dp"
    Android:layout_gravity="center_horizontal"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content">

    <AutoCompleteTextView
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:hint="occupation"
        Android:focusableInTouchMode="false"<--this is the important part
        Android:id="@+id/actv_occupation"
        Android:ems="10"
        Android:completionThreshold="0"<--this too
        />
</Android.support.design.widget.TextInputLayout>
0