Android防止在选择项目后自动完成文本视图中删除下拉列表

Android防止在选择项目后自动完成文本视图中删除下拉列表,android,autocompletetextview,Android,Autocompletetextview,即使我正在AutoCompleteTextView上设置setOnItemClickListener并在其中执行一些自定义操作,但一旦该方法完成,列表将取消并在editbox中打印出object.toString class task extends TimerTask { @Override public void run() { runOnUiThread(new Runnable()

即使我正在AutoCompleteTextView上设置setOnItemClickListener并在其中执行一些自定义操作,但一旦该方法完成,列表将取消并在editbox中打印出object.toString

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

    });
我想防止删除item select上的下拉列表,也希望它不会替换编辑框。我怎样才能做到这一点

编辑,新答案:
            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);
        }

    });
这对我来说很有用,但它会关闭一秒钟,然后再次打开

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

    });
类任务扩展TimerTask{
@凌驾
公开募捐{
runOnUiThread(新的Runnable(){
@凌驾
公开募捐{
autoComplete.showDropDown();
}
});
}
};
setOnItemClickListener(新的OnItemClickListener(){
公共链接(AdapterView arg0、视图arg1、内部arg2、,
长arg3){
新计时器()。计划(新任务(),0,10);
}
});

我将onClickListener添加到用于下拉适配器的整个自定义行布局中。这样,每当单击行时,都会调用my row onClickListener,而下拉列表的默认值不是。

第一个问题-防止取消下拉列表:

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

    });
解决如下

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

    });
第二个问题-防止文本替换:(适用于感兴趣的其他人)

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

    });
您可以扩展AutoCompleteTextView并覆盖

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

    });
protected void replaceText(CharSequence text) {}
什么也不做

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

    });

正如其他人提到的,重写performCompletion()在这里没有任何帮助。

我还想实现我在下面代码中实现它时使用的相同功能

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

    });
创建自定义类并扩展AutoCompleteTextView

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

    });
重写dismissDropDown()方法并从中删除超级调用。 我会为你工作的

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

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

    }
}

不调用
super
覆盖
replaceText
效果很好(防止将建议的文本输入
AutoCompleteTextView
),但覆盖
dismissDropDown
不仅会导致在单击项目时,而且在按下
时,在对话框外部触摸等时,不会取消下拉列表

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

    });
最后,我根本没有使用
AutoCompleteTextView
中的
setonimclicklinklistener
方法。我正在自定义
ArrayAdapter
中创建自定义onClick,并为
getView
方法返回的所有
View
设置它

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

    });
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时才会显示涟漪/选择器)

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

    });
我还需要始终可见的功能,因为我的自动完成必须始终显示第一个位置(功能),即使没有建议(如果存在,则显示在下面的位置1+)

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

    });
AlwaysVisibleAutoCompleteTextView
处于聚焦状态,但下拉菜单被取消,用户再次按
view
时,则下拉菜单不显示,因为焦点状态未更改(
onFocusChanged
未调用),所以

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

    });

如果您不打算将
setOnTouchListener
用于您的
AutoCompleteTextView
用于任何其他目的,那么
OnTouchListener
可以设置在
AlwaysVisibleAutomleteTextView
类中(在每个构造函数中)

至少看起来他们计划在不久的将来添加这个

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

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

我已经有了一个短信观察者。我需要它在最小API级别10上工作。我尝试扩展AutoCompleteTextView并重写performCompletion,但该方法从未被调用。@user1018916有常规的
setOnClickListener
(仅在textview单击时有效)还有
setOnFocusChangeListener
。我找到的唯一一件事是我从api 17中给你的答案中的一个片段。显然,textwatcher没有从下拉点击中检测到更改,这是一个糟糕的结果