即使我在AutoCompleteTextView上设置setOnItemClickListener并在其中执行一些自定义操作,一旦该方法完成,列表就会解除并打印出编辑框中的object.toString。
我想阻止解除项目选择的下拉列表,并且还希望它不会替换编辑框。我怎样才能做到这一点?
答案 0 :(得分:2)
我也希望实现与下面代码相同的实现方法。
创建自定义类并扩展AutoCompleteTextView。
覆盖dismissDropDown()方法并从中删除超级调用。 会为你工作。
public class CustomAutoComplete extends AutoCompleteTextView {
public NoSelectionAutoComplete(Context context) {
super(context);
}
public NoSelectionAutoComplete(Context context, AttributeSet attrs) {
super(context, attrs);
}
public NoSelectionAutoComplete(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void replaceText(CharSequence text) {
}
@Override
public void dismissDropDown() {
}
}
答案 1 :(得分:1)
我将onClickListener添加到我用于下拉适配器的整个自定义行布局中。这样,无论何时单击该行,我的行onClickListener都会被调用,而下拉列表的默认值则不会。
答案 2 :(得分:1)
第一个问题 - 防止下线解雇:
解决方案如下。
第二个问题 - 防止文本替换:(对于其他感兴趣的人)
您可以扩展AutoCompleteTextView并覆盖
protected void replaceText(CharSequence text) {}
什么都不做。
正如其他人所提到的,覆盖performCompletion()在这里无济于事。
答案 3 :(得分:0)
编辑,新答案: 这对我有用,但它会关闭一秒钟,然后再次打开。
class task extends TimerTask {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
autoComplete.showDropDown();
}
});
}
};
autoComplete.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
new Timer().schedule(new task(),0, 10);
}
});
答案 4 :(得分:0)
在不调用replaceText
的情况下覆盖super
可以正常工作(阻止将建议的文字输入AutoCompleteTextView
),但覆盖dismissDropDown
不会导致不删除下拉列表,不仅在点击项目时,当onBackPressed
时,触及外部对话等...
我最终没有使用setOnItemClickListener
中的AutoCompleteTextView
方法。我正在自定义ArrayAdapter
中创建自定义onClick,并为View
方法返回的所有getView
设置
View.OnClickListener onClick=null;
public void setOnItemClickListener(View.OnClickListener onClick) {
this.onClick=onClick;
/*this.onClick=new View.OnClickListener(){
@Override
public void onClick(View v) {
if(v.getTag()==null)
return;
Integer position = (Integer) v.getTag();
Toast.makeText(v.getContext(), "position: "+postion, Toast.LENGTH_SHORT).show();
}
});*/
}
@NonNull
@Override
public View getView(int position, View convertView, @NonNull ViewGroup parent) {
... call super/inflate convertView and do your stuff here
setCustomOnClick(convertView, position);
return convertView;
}
private void setCustomOnClick(final View view, final int position){
view.setTag(position);
view.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
if(onClick==null)
return;
// inside called onClick method v.getTag() will return pressed position
onClick.onClick(v);
}
});
}
事实上,为整个视图设置onClick将覆盖“原始”总是解除并且总是替换文本onClick(之后根本不会被调用)。请记住在按下时添加自定义图形表示(仅在“原始”onClick调用时显示波纹/选择器)
我还需要始终可见的功能,因为我的自动填充必须始终显示第一个位置(功能),即使没有任何建议(如果存在,则显示在位置1+以下)
public class AlwaysVisibleAutoCompleteTextView extends AppCompatAutoCompleteTextView {
private boolean showAlways=true;
public AlwaysVisibleAutoCompleteTextView(Context context) {
super(context);
}
public AlwaysVisibleAutoCompleteTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public AlwaysVisibleAutoCompleteTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public void setShowAlways(boolean showAlways) {
this.showAlways = showAlways;
}
@Override
public boolean enoughToFilter() {
return showAlways || super.enoughToFilter();
}
@Override
protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
super.onFocusChanged(focused, direction, previouslyFocusedRect);
showDropDownIfFocused();
}
private void showDropDownIfFocused() {
if (enoughToFilter() && isFocused() && getWindowVisibility() == View.VISIBLE)
showDropDown();
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
showDropDownIfFocused();
}
}
当AlwaysVisibleAutoCompleteTextView
被关注,但下拉列表被取消,用户再次按view
,则下拉列表未显示,因为焦点状态未更改(onFocusChanged
未调用),所以
autoComplete.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP)
autoComplete.showDropDown();
return false;
}
});
如果您不打算将setOnTouchListener
用于AutoCompleteTextView
用于任何其他目的,则可以在OnTouchListener
类(在每个构造函数中)中设置AlwaysVisibleAutoCompleteTextView
答案 5 :(得分:0)
至少看起来他们计划在不久的将来添加它。
/**
* Sets whether the drop-down should remain visible as long as there is there is
* {@link #enoughToFilter()}. This is useful if an unknown number of results are expected
* to show up in the adapter sometime in the future.
*
* The drop-down will occupy the entire screen below {@link #getDropDownAnchor} regardless
* of the size or content of the list. {@link #getDropDownBackground()} will fill any space
* that is not used by the list.
*
* @param dropDownAlwaysVisible Whether to keep the drop-down visible.
*
* @hide Pending API council approval
*/
public void setDropDownAlwaysVisible(boolean dropDownAlwaysVisible) {
mPopup.setDropDownAlwaysVisible(dropDownAlwaysVisible);
}