Show all items in AutocompleteTextView without writing text
Asked Answered
B

14

63

I have a AutocompleteTextView and it works fine. When I write a word it shows the relevant result but I want to show all items without writing any word in AutocompleteTextView. How can I do that.

Baseline answered 21/3, 2013 at 10:28 Comment(2)
Try this link code may be help you.... #15224527Reconstructionist
It is not the actual solution that I want. Anyway thanks.Baseline
S
92

You need to extend AutoCompleteTextView,

"When threshold is less than or equals 0, a threshold of 1 is applied.".

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

}

in xml

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

EDIT 1

Create new class named InstantAutoComplete then put this code into the class.

In your layout xml use this class like

then find this widget in your actity (onCreate method).

Look at this example

Suisse answered 21/3, 2013 at 10:35 Comment(12)
But the problem is I already extends Activity in that class and it is required. So cannot able to extend AutoCompleteTextView like your solution. Is there any way.Baseline
You dont need to extend your activty, it is new custom autocomplete textview, just create it and use in your layout. Pls look at edited answerSuisse
dl.dropbox.com/u/68130108/AutoComplateTextView.rar look at this exampleSuisse
I get java.lang.NullPointerException at android.widget.AutoCompleteTextView.performFiltering(AutoCompleteTextView.java:841) at com.mybusiness.ui.view.InstantAutoComplete.onFocusChanged(InstantAutoComplete.java:35). Any suggestions?Steffy
Works but doesn't show suggestions the first time when it receives focus. How do I rectify this?Zinnia
"When threshold is less than or equals 0, a threshold of 1 is applied." What a crappy idea... But thank you for pointing that out.Fatherhood
This is a InstantAutoComplete, if you not put more code you will get errors in a future, not recommended to meCingulum
@Steffy add a check for getFilter() to be non-null before calling performFiltering()Araminta
It seems showDropDown() still needs to be called along with performFiltering(...), because sometimes the dropdown does not appear.Phthalein
TextInputLayout does not seems to work properly with the extended version of AutoCompleteTextView. Anyone know how to fix it?Gallup
I have one question. I'm clearing my screen once user clicks on submit button, then im supposed to clear screen, im doing autotv.settext("") but soon after that suggestion drop down opening again. where as i want that only when user clicks on that autocompleteTextview. How can i do that ?Clementinaclementine
See a solution of Jan Moravec (https://mcmap.net/q/297249/-show-all-items-in-autocompletetextview-without-writing-text) to show the list on every click.Githens
S
58

BETTER SOLUTION HERE

You don't need to customize your AutoCompleteTextView. Instead just call autoCompleteTextView.showDropDown() Whenever you need it.....cheers :)

Sheared answered 6/2, 2014 at 11:38 Comment(6)
Unfortunately this does not always work. I'm not sure why, but on some devices seem to ignore the command when the text field is empty.Bolen
did you set any threshold value for it?Sheared
Yes, 0. I even call requestFocus beforehandBolen
This will only work first time. But if you write something and then clear it, It will show nothing. That is because you trying to show the popup for the current state of the adapter which is empty after filtering with empty string.Hairy
@SimonKarmy The popup doesn't show even when the dataset is not empty but the text is. Whenever filtering is performed with empty string I populate the dataset with some stored values.Aubergine
You should use showDropDown() in both OnFocusChangeListener when focus = true and in OnTextChangeListener say afterTextChanged, when length = 0;Paperboy
I
33

It Works for me:

add to your object next event methods:

    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;
        }
    });
Iliad answered 11/3, 2014 at 18:14 Comment(2)
I don't think you need both. Doesn't touching the View give it focus as well?Ammonify
It works for me. But I had to add "auto_complete_text_view.threshold = 1 " in addition with your answerSlipcover
G
19

This works for me perfectly, this is an easy way to resolve the problem:

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;
    }
});
Granado answered 8/11, 2016 at 9:18 Comment(4)
adapter.getFilter().filter(etUsername.getText().toString()); keeps the filter.Tymbal
thanks for "adapter.getFilter().filter(null);" it helps me show all items even autocompletetextview was filled with default value.Goda
this activates dropdown even when I scroll through formStupefaction
It works, but as in other answers, it hides and shows the list on every click inside AutoCompleteTextView. Also after you typed a letter (and shrinked records count) it will show the full list when click.Githens
S
9

You need to call requestFocus(); to show keyboard, otherwise keyboard does not pop up.

The method forcefully shows drop-down list.

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;
        }
    });
Supernumerary answered 25/9, 2014 at 10:59 Comment(3)
Thank you for requestFocus()! A good idea! It works, but don't forget to set autocomptv.threshold = 1 (or android:completionThreshold="1"). Without it a list will hide after you type the first letter (and then appear again after the second letter).Githens
Also see #47107605 and #32065586 to avoid warnings.Githens
it still allows to write textJeremiahjeremias
O
8

you need to put those steps to make it work perfectly

1-in your xml put this

    <androidx.appcompat.widget.AppCompatAutoCompleteTextView
            android:id="@+id/account_type_spinner"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginStart="@dimen/_16sdp"
            android:layout_marginTop="@dimen/_24sdp"
            android:layout_marginEnd="@dimen/_16sdp"
            android:background="@drawable/rounded_edt_with_border"
            android:completionThreshold="0"
            android:drawableRight="@drawable/ic_arrow_down"
            android:hint="@string/account_type"
            android:imeOptions="actionNext"
            android:inputType="text"
            android:padding="12dp"
            android:textSize="@dimen/_15sp"
             />

you just need to set android:completionThreshold to zero

2- in your java code put

  mViewDataBinding.accountTypeSpinner.setOnFocusChangeListener((v, hasFocus) -> {
        if (hasFocus)
            mViewDataBinding.accountTypeSpinner.showDropDown();
    });
Onerous answered 2/3, 2020 at 12:37 Comment(3)
It works, but if you press Back (and hide the list) and then click inside AutoCompleteTextView again, it won't show the list. After you type and erase symbols it will show the list.Githens
this is happening because I use only setOnFocusChangeListener you could add setOnClickListener and repeat the same code and it should do the trickOnerous
Thanks! I tried other solutions as well. I understood that the list will hide on every click inside AutoCompleteTextView. So, when using setOnClickListener it hides and shows the list (except first click).Githens
P
4

use this :

 text.setOnTouchListener(new View.OnTouchListener(){


            @Override
            public boolean onTouch(View arg0, MotionEvent arg1) {
                // TODO Auto-generated method stub
                text.showDropDown();
                return false;
            }
            });
Paraphrase answered 12/10, 2016 at 6:23 Comment(1)
must be the answerScholasticate
U
2
Nothing Custom Required.

I tried All solutions but in some case that does not work. For Example one solution work for first time but when you remove text it will not appear. So I dug more and found following solution.

Suggestions are welcome.

XML:

<android.support.design.widget.TextInputLayout
                    android:id="@+id/tl"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content">

                    <android.support.v7.widget.AppCompatAutoCompleteTextView
                        android:id="@+id/autoComplete"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:hint="Hint Here" />


                </android.support.design.widget.TextInputLayout>

Kotlin:

val adapter = ArrayAdapter<BusinessNoResult>(context, android.R.layout.select_dialog_item, listItems)
autoComplete.setAdapter(adapter)
//threshold specifies the minimum number of characters the user has to type in 
//the
//edit box before the drop down list is shown
autoComplete.threshold = 0

//we have to add check for 0 number of character in edit text. When that 
//happens, we will show pop up manually
autoComplete.addTextChangedListener(object : TextWatcher {
    override fun afterTextChanged(s: Editable?) {}

    override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}

    override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
        //first check if length of input is 0
        if(s?.length ?: 0 == 0){
            //if you don't use handler with post delay, the API will hide pop 
            //up, even if you show it. There could be better ways to this, but 
            //I have implemented this and after 100 millis it gives an animated 
            //look
            Handler().postDelayed({
                //manually show drop down
                autoComplete.showDropDown()
            }, 100) // with 100 millis of delay
        }
    }
})
//when user focus out the view, drop down vanishes. When come back it will not 
//show, so to cover this scenario add following.
autoComplete.setOnFocusChangeListener { _, hasFocus ->
    //when gain focus manually show drop down
    if(hasFocus)
        autoComplete.showDropDown()
}
Udele answered 13/6, 2019 at 12:49 Comment(1)
I removed BusinessNoResult, added implementation 'com.google.android.material:material:1.2.0-beta01', changed android.support.design.widget.TextInputLayout to com.google.android.material.textfield.TextInputLayout and android.support.v7.widget.AppCompatAutoCompleteTextView to AutoCompleteTextView. As in other solutions, it shows the list, but when you click again or press Back button, it then won't show the list until write some symbols.Githens
W
2

All answers are outdated. With material design, it becomes a lot easier and smooth. Make sure you put inputType as none for not to open the keyboard anymore.

XML

 <com.google.android.material.textfield.TextInputLayout
        android:id="@+id/et_countries_list"
        style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.ExposedDropdownMenu"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="20dp"
        android:hint="Demo hint"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintTop_toTopOf="parent"

        >

        <com.google.android.material.textfield.MaterialAutoCompleteTextView
            android:id="@+id/countries_list"
            android:layout_width="match_parent"
            android:inputType="none"
            android:layout_height="60dp"
            />

    </com.google.android.material.textfield.TextInputLayout>

Then just add prepare your adapter and add it.

   ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_dropdown_item_1line, new String[]{
                "Belgium", "France", "Italy", "Germany", "Spain", "Belgium", "France", "Italy", "Germany", "Spain"});
       
        AutoCompleteTextView autoCompleteTextView = (AutoCompleteTextView)
                findViewById(R.id.countries_list);
        autoCompleteTextView.setAdapter(adapter);

You are done. It will work better than a spinner. You can set hint, error, helper as well.

Walkon answered 2/2, 2021 at 19:32 Comment(0)
S
1

If other solutions does not work for you try this instead. Popup is displayed always on click.

   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();
    }
}
Saleh answered 19/10, 2018 at 15:6 Comment(2)
Thanks! Probably onTouchEvent is not needed. It shows the list when click. First hides and then shows. I think, this is a behaviour of the spinner to hide on many events.Githens
First it worked very well until I added InstantAutoComplete to a complex layout. Then the keyboard started to hide. If revert back to AutoCompleteTextView it shows the keyboard and works as expected, but doesn't show full list ot items. If I remove all 3 methods inside InstantAutoComplete, it doesn't show the keyboard and even doesn't work as AutoCompleteTextView. Maybe some other attributes in the layout are guilty. So, it is a good solution, but check in complex layouts.Githens
R
0

Here an approach with onclicklistener as I found tat onTouch was a bit irritating when trying to scroll. mOccupation is the AutocompleteTextView in 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;
        }
    });

I managed to put it all into a Textinputlayout with the following xml specifications:

<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>
Reform answered 12/11, 2018 at 1:18 Comment(0)
S
0

It helped me:

private AutoCompleteTextView autoCompleteTextViewRFID; 

...
    autoCompleteTextViewRFID = binding.choiceFieldRFID;
    List<String> rfidArray = databaseManager.readCowsRFID();
    ArrayAdapter<String> rfidAdapter = new ArrayAdapter<>(getActivity(), android.R.layout.simple_dropdown_item_1line, rfidArray);
    autoCompleteTextViewRFID.setThreshold(1);
    autoCompleteTextViewRFID.setAdapter(rfidAdapter);

...

autoCompleteTextViewTypeRange.setOnTouchListener((v, event) -> {
        autoCompleteTextViewTypeRange.showDropDown();
        return true;
    });

XML:

            <AutoCompleteTextView
            android:id="@+id/typeRange"
            android:gravity="center"
            android:focusable="true"
            android:focusableInTouchMode="true"
            android:layout_width="match_parent"
            android:layout_height="40dp" />
Shuffleboard answered 2/8, 2023 at 7:9 Comment(0)
G
-1

I got a great solution to this. It's simple. This is just the drop-down and choosing from the options.

Make sure you add these two lines to XML.

android:completionThreshold="0" android:focusableInTouchMode="false"

XML

<com.google.android.material.textfield.TextInputLayout
    android:layout_marginTop="10dp"
    style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <androidx.appcompat.widget.AppCompatAutoCompleteTextView
        android:id="@+id/select_area"
        android:layout_width="match_parent"
        android:layout_height="52dp"
        android:padding="10dp"
        android:textSize="15sp"
        android:singleLine="true"
        android:drawableEnd="@drawable/ic_arrow_down"
        android:completionThreshold="0"
        android:focusableInTouchMode="false"
        android:hint="Select an Area"
        android:inputType="text"
        android:maxLines="1" />

</com.google.android.material.textfield.TextInputLayout>

JAVA

area_autocomplete.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        area.showDropDown();
    }
});
Grimes answered 20/3, 2020 at 3:25 Comment(3)
This will show dropdown, but user cannot then type in it. This solution is better https://mcmap.net/q/297249/-show-all-items-in-autocompletetextview-without-writing-textBecquerel
As in the solution of Abdulmalek Dery (https://mcmap.net/q/297249/-show-all-items-in-autocompletetextview-without-writing-text) (if change to click listener) it hides and shows the list on every click. I can enter letters.Githens
Agree with @Haris, it hides cursor, but you can enter letters. It is because of android:completionThreshold="0" android:focusableInTouchMode="false".Githens
C
-1

You could simply use this single line of code

autoCompleteTextView.setThreshold(100);
Csch answered 2/7, 2020 at 18:15 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.