Android - 防止在项目选择后解除AutoCompleteTextView中的下拉列表

时间:2014-06-06 17:41:59

标签: android autocompletetextview

即使我在AutoCompleteTextView上设置setOnItemClickListener并在其中执行一些自定义操作,一旦该方法完成,列表就会解除并打印出编辑框中的object.toString。

我想阻止解除项目选择的下拉列表,并且还希望它不会替换编辑框。我怎样才能做到这一点?

6 个答案:

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