问题
How I can do something when popup just opens? There is a method isPopupShowing()
, but nothing like onPopupShow()
callback unfortunately.
回答1:
Hm, dont know if there is an easier way, and this is a bit of a workaround, but you could try adding a TextWatcher
via addTextChangedListener
and do a isPopupShowing()
to check if popup is up. Again its a bit of workaround and wont work if you prorammatically show the popup.
回答2:
My answer could be a little bit different but it works when you have valid results.
1.- Extend your own class of AutoCompleteTextView
:
public class ContractsAutoCompleteTextView extends android.support.v7.widget.AppCompatAutoCompleteTextView {
public ContractsAutoCompleteTextView(Context context) {
super(context);
}
public ContractsAutoCompleteTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ContractsAutoCompleteTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
}
2.- We know that onFilterComplete(int count)
will get notified when items are filtered (and just later shown). Introduce that in your class:
@Override
public void onFilterComplete(int count) {
super.onFilterComplete(count);
}
3.- Create an interface
to notify the UI how many items are filtered every time you change text:
interface OnContractsAvailability {
void contractsRetrieved(int count);
}
private OnContractsAvailability onContractsAvailability;
public void setOnContractsAvailability(OnContractsAvailability onContractsAvailability) {
this.onContractsAvailability = onContractsAvailability;
}
4.- Now notify your interface
:
@Override
public void onFilterComplete(int count) {
super.onFilterComplete(count);
if (onContractsAvailability != null) {
onContractsAvailability.contractsRetrieved(count);
}
}
This is the whole class
/**
* Created by rafaelruizmunoz on 07/07/2017.
*/
public class ContractsAutoCompleteTextView extends android.support.v7.widget.AppCompatAutoCompleteTextView {
public ContractsAutoCompleteTextView(Context context) {
super(context);
}
public ContractsAutoCompleteTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ContractsAutoCompleteTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public void onFilterComplete(int count) {
super.onFilterComplete(count);
if (onContractsAvailability != null) {
onContractsAvailability.contractsRetrieved(count);
}
}
interface OnContractsAvailability {
void contractsRetrieved(int count);
}
private OnContractsAvailability onContractsAvailability;
public void setOnContractsAvailability(OnContractsAvailability onContractsAvailability) {
this.onContractsAvailability = onContractsAvailability;
}
}
This is the UI implementation
contractsET.setOnContractsAvailability(count -> System.out.println(String.valueOf(count)));
And these are the results
07-07 11:51:36.975 32174-32174/? I/System.out: 3138
07-07 11:51:37.520 32174-32174/? I/System.out: 1147
07-07 11:51:37.656 32174-32174/? I/System.out: 167
07-07 11:51:38.538 32174-32174/? I/System.out: 87
07-07 11:51:39.240 32174-32174/? I/System.out: 17
07-07 11:51:40.039 32174-32174/? I/System.out: 3
07-07 11:51:41.343 32174-32174/? I/System.out: 0
回答3:
I know it's late. Better late than never.
If popup is only shown when user clicks on AutoCompleteTextView
, we can set OnClickListener
to it and check if popup is shown.
autoCompleteTextView.setOnClickListener(v -> {
if (autoCompleteTextView.isPopupShowing()){
//Do what you want
}
});
来源:https://stackoverflow.com/questions/29429185/android-detecting-when-a-autocompletetextview-popup-is-opened