Java AutoCompleteTextView强制显示所有项目
在我的应用程序中有一个时刻,我需要强制显示建议列表中的所有项目,无论用户键入了什么。我该怎么做 我试图做一些过滤,但对我来说,作为一个初学者过滤是太复杂了,我试图搜索初学者教程过滤没有任何运气。也许,有一种更简单的方法可以强制显示所有建议项 编辑: 基本上,我的想法是,当用户键入列表中没有的内容时,它会显示他可以拥有的所有可用选项 我已经找到了检查ACTV是否显示的最佳方法,但onTextChangeEvent会将用户键入的文本与列表进行比较,如果没有找到元素,则显示完整列表Java AutoCompleteTextView强制显示所有项目,java,android,autocompletetextview,Java,Android,Autocompletetextview,在我的应用程序中有一个时刻,我需要强制显示建议列表中的所有项目,无论用户键入了什么。我该怎么做 我试图做一些过滤,但对我来说,作为一个初学者过滤是太复杂了,我试图搜索初学者教程过滤没有任何运气。也许,有一种更简单的方法可以强制显示所有建议项 编辑: 基本上,我的想法是,当用户键入列表中没有的内容时,它会显示他可以拥有的所有可用选项 我已经找到了检查ACTV是否显示的最佳方法,但onTextChangeEvent会将用户键入的文本与列表进行比较,如果没有找到元素,则显示完整列表 public vo
public void onTextChanged(CharSequence s, int start, int before, int count)
{
final EditText editText = (EditText) findViewById(R.id.vardsUserInput);
String strValue = editText.getText().toString().toUpperCase();
String temp;
int Cc=0; //my count variable
for(int i=0; i<vardi.length; i++)
{
temp = vardi[i].toUpperCase();
if(temp.startsWith(strValue.toUpperCase()))
{
Log.d("testing",vardi[i]);
Cc++;
}
}
if(Cc == 0)
{
//Show all the available options
textView.showDropDown();
}
}
public void onTextChanged(字符序列、int start、int before、int count)
{
final EditText EditText=(EditText)findViewById(R.id.vardsUserInput);
字符串strValue=editText.getText().toString().toUpperCase();
字符串温度;
int Cc=0;//我的计数变量
对于(int i=0;i您没有定义要显示所有结果的“时刻”,因此我希望这是合适的。但请尝试以下方法:
AutoCompleteTextView autoComplete;
String savedText;
public void showAll() {
savedText = autoComplete.getText().toString();
autoComplete.setText("");
autoComplete.showDropDown();
}
public void restore() {
autoComplete.setText(savedText);
}
基本上,经过5-6个小时的实验来了解该死的过滤器是如何工作的,我编写了自己的适配器,它完全符合我的要求:
public class burtuAdapteris extends ArrayAdapter<String> implements Filterable {
ArrayList<String> _items = new ArrayList<String>();
ArrayList<String> orig = new ArrayList<String>();
public burtuAdapteris(Context context, int resource, ArrayList<String> items) {
super(context, resource, items);
for (int i = 0; i < items.size(); i++) {
orig.add(items.get(i));
}
}
@Override
public int getCount() {
if (_items != null)
return _items.size();
else
return 0;
}
@Override
public String getItem(int arg0) {
return _items.get(arg0);
}
@Override
public Filter getFilter() {
Filter filter = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
if(constraint != null)
Log.d("Constraints", constraint.toString());
FilterResults oReturn = new FilterResults();
/* if (orig == null){
for (int i = 0; i < items.size(); i++) {
orig.add(items.get(i));
}
}*/
String temp;
int counters = 0;
if (constraint != null){
_items.clear();
if (orig != null && orig.size() > 0) {
for(int i=0; i<orig.size(); i++)
{
temp = orig.get(i).toUpperCase();
if(temp.startsWith(constraint.toString().toUpperCase()))
{
_items.add(orig.get(i));
counters++;
}
}
}
Log.d("REsult size:" , String.valueOf(_items.size()));
if(!counters)
{
_items.clear();
_items = orig;
}
oReturn.values = _items;
oReturn.count = _items.size();
}
return oReturn;
}
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
if(results != null && results.count > 0) {
notifyDataSetChanged();
}
else {
notifyDataSetInvalidated();
}
}
};
return filter;
}
}
在我的例子中,liste是:ArrayList liste=new ArrayList();
它实际上比列出的Sam更简单。每当你想显示所有内容时,只需执行以下操作:
performFiltering("", 0);
过滤完成后,它将自动显示下拉列表,所有项目都可见。方法强制显示下拉列表
您需要调用requestFocus();以显示键盘,否则键盘不会弹出
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;
}
});
这对我来说非常有效,这是解决问题的简单方法:
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;
}
});
final ArrayAdapter adapter=new ArrayAdapter(getContext(),android.R.layout.simple\u dropdown\u item\u 1line,用户名列表);
etUsername.setThreshold(1);
etUsername.setAdapter(适配器);
etUsername.setOnTouchListener(新视图.OnTouchListener(){
@SuppressLint(“ClickableViewAccessibility”)
@凌驾
公共布尔onTouch(View paramView、MotionEvent paramMotionEvent){
if(usernameLists.size()>0){
//显示所有建议
如果(!etUsername.getText().toString()等于(“”)
adapter.getFilter().filter(null);
etUsername.showDropDown();
}
返回false;
}
});
正如“ArtOfWarfare”所建议的那样,您只需子类并重写performFiltering():
我正在成功地使用它。如果要立即显示建议,则必须重写enoughToFilter()
,使其始终返回true。要忽略作为文本输入的内容,必须使用performFiltering(“,0”)
带有空筛选模式。然后,AutoCompleteTextView显示所有建议
这是我从其他StackOverflow帖子中组合的解决方案:
public class InstantAutoComplete extends android.support.v7.widget.AppCompatAutoCompleteTextView {
public InstantAutoComplete(Context context) {
super(context);
}
public InstantAutoComplete(Context context, AttributeSet attrs) {
super(context, attrs);
}
public InstantAutoComplete(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public boolean enoughToFilter() {
return true;
}
@Override
protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
super.onFocusChanged(focused, direction, previouslyFocusedRect);
if (focused && getAdapter() != null) {
performFiltering("", 0);
}
}
}
这就是我的工作原理:
public class CustomAutoCompleteTextView extends AutoCompleteTextView {
public CustomAutoCompleteTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean enoughToFilter() {
return true;
}
@Override
protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
super.onFocusChanged(focused, direction, previouslyFocusedRect);
if (focused) {
performFiltering(getText(), 0);
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
this.showDropDown();
return super.onTouchEvent(event);
}
}
}
单击按钮下拉列表(imageview)后,我需要显示autocompletetextview中的所有数据。使用类扩展autocompletetextview并添加此函数,它的工作方式非常神奇。简单易懂的答案是:
在autoCompleteTextView.setText(“”)之后,只需像这样从适配器中删除过滤器:
AutoCompleteTextView autoComplete;
String savedText;
public void showAll() {
savedText = autoComplete.getText().toString();
autoComplete.setText("");
autoComplete.showDropDown();
}
public void restore() {
autoComplete.setText(savedText);
}
autoCompleteTextView.adapter.filter.filter(空)
就这样,过滤消失了,整个下拉列表显示出来。要停止适配器过滤,您可以在textview上设置足够高的树名:
autoCompleteTextView.setThreshold(100);
希望能有帮助
autoComplete.setText(“”)
筛选器{it.contains(constraint.trim(),true)}
注意:您必须使用空格文本将文本设置为“自动完成”,在过滤器中,您应该修剪约束文本输入,它将显示所有下拉列表。当我尝试此操作时,我立即得到“很遗憾,此应用程序已停止”但是我不太明白在哪里应该使用还原功能。好的,那么我需要一些你的问题的上下文。请发布你在问题中编写的相关代码,并描述你想显示所有内容的时刻。@XCoder很棒的描述!你是在使用FilterQueryProvider和数据库来更新你的AutoComp吗leteTextView?不,我不是。我会看一看。如果我想不出来,我会大喊一声,因为过滤器在Actv中非常混乱。你能提供多一点上下文吗?performFiltering()是类的一个受保护方法。似乎我需要对Filter进行子类化才能掌握它。我在写这篇文章时已经不在公司工作了,自从12月离开Android之后,我就再也没有接触过它,所以很遗憾,我在上下文中无法访问该代码。对不起,我正在复制和粘贴,但留下了BurtuAda这个名字向您的工作致敬。:)a实现可过滤性是解决方案!Lol soo比其他解决方案短得多,也简单得多,使用AutoCompleteTextView代替那个该死的微调器完成了任务,有了这个,我可以设置提示和错误,再也不用使用那个微调器了,谢谢:)我使用了OnClickListener,并将focusable属性设置为false。节省了时间。非常感谢。这种方法很有效,但是当你再次点击该字段而不是关闭下拉菜单时,它会再次打开!!为我工作。新材料曝光下拉列表给我带来了问题。用户选择项目后,它将不再显示适配器项目,所以这是一个完美的修复!谢谢
class InstantAutoComplete(context: Context?, attrs: AttributeSet?) : AutoCompleteTextView(context, attrs) {
override fun enoughToFilter(): Boolean {
return true
}
override fun onFocusChanged(focused: Boolean, direction: Int, previouslyFocusedRect: Rect?) {
super.onFocusChanged(focused, direction, previouslyFocusedRect)
if (focused && filters != null) {
performFiltering(text, 0)
}
}
fun performFilter() {
performFiltering(text, 0)
showDropDown()
}
autoCompleteTextView.setThreshold(100);