Android AutoCompleteTextview不显示仅基于前两个字符的建议

Android AutoCompleteTextview不显示仅基于前两个字符的建议,android,xml,autocompletetextview,Android,Xml,Autocompletetextview,在我的应用程序中,我使用的是输入两个字符后显示数据的AutoCompleteTextView,但我的问题是,输入两个字符后,我得到的所有建议都是在word中输入这两个字符 但是,我只想建议输入前两个字符的单词 MyMain3Activity.java类 import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.ArrayAdapter; import andro

在我的应用程序中,我使用的是输入两个字符后显示数据的
AutoCompleteTextView
,但我的问题是,输入两个字符后,我得到的所有建议都是在word中输入这两个字符

但是,我只想建议输入前两个字符的单词

MyMain3Activity.java

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;

public class Main3Activity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main3);
        String[] myData={"sai wood","neelam sai","sandhya fabrics","wood date","Naresh industries"};
        ArrayAdapter autoAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, myData);
        AutoCompleteTextView autoText=(AutoCompleteTextView)findViewById(R.id.auto);
        autoText.setAdapter(autoAdapter);
    }
}
导入android.support.v7.app.app活动;
导入android.os.Bundle;
导入android.widget.ArrayAdapter;
导入android.widget.AutoCompleteTextView;
公共类Main3活动扩展了AppCompative活动{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main3);
字符串[]myData={“sai wood”、“neelam sai”、“sandhya织物”、“wood date”、“Naresh industries”};
ArrayAdapter autoAdapter=新的ArrayAdapter(这是android.R.layout.simple\u list\u item\u 1,myData);
AutoCompleteTextView自动图文集=(AutoCompleteTextView)findViewById(R.id.auto);
自动图文集.setAdapter(autoAdapter);
}
}
和myMain3Activity.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/black"
    tools:context="com.example.dell.mytrialapp.Main3Activity">
<AutoCompleteTextView
    android:id="@+id/auto"
    android:layout_width="320dp"
    android:layout_height="40dp"
    android:layout_centerHorizontal="true"
    android:layout_marginLeft="10dp"
    android:layout_marginTop="105dp"
    android:background="@color/white"
    android:lines="1"
    android:marqueeRepeatLimit="marquee_forever"
    android:scrollHorizontally="true"
    android:singleLine="true"
    android:textColor="@color/black"
    android:textSize="17dp" />
</RelativeLayout>


将此行添加到
自动完成文本视图中

android:completionThreshold="1"

要从第一个字符开始工作,请添加
autoCtextView.setThreshold(1)


您可以使用此自定义适配器

创建CustomListAdapter类:

import android.content.Context;
import android.support.annotation.NonNull;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Filter;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

public class CustomListAdapter extends ArrayAdapter {

    private List<String> dataList;
    private Context mContext;
    private int itemLayout;

    private ListFilter listFilter = new ListFilter();
    private List<String> dataListAllItems;



    public CustomListAdapter(Context context, int resource, List<String> storeDataLst) {
        super(context, resource, storeDataLst);
        dataList = storeDataLst;
        mContext = context;
        itemLayout = resource;
    }

    @Override
    public int getCount() {
        return dataList.size();
    }

    @Override
    public String getItem(int position) {
        Log.d("CustomListAdapter",
                dataList.get(position));
        return dataList.get(position);
    }

    @Override
    public View getView(int position, View view, @NonNull ViewGroup parent) {

        if (view == null) {
            view = LayoutInflater.from(parent.getContext())
                    .inflate(itemLayout, parent, false);
        }

        TextView strName = (TextView) view.findViewById(R.id.textView);
        strName.setText(getItem(position));
        return view;
    }

    @NonNull
    @Override
    public Filter getFilter() {
        return listFilter;
    }

    public class ListFilter extends Filter {
        private Object lock = new Object();

        @Override
        protected FilterResults performFiltering(CharSequence prefix) {
            FilterResults results = new FilterResults();
            if (dataListAllItems == null) {
                synchronized (lock) {
                    dataListAllItems = new ArrayList<String>(dataList);
                }
            }

            if (prefix == null || prefix.length() == 0) {
                synchronized (lock) {
                    results.values = dataListAllItems;
                    results.count = dataListAllItems.size();
                }
            } else {
                final String searchStrLowerCase = prefix.toString().toLowerCase();

                ArrayList<String> matchValues = new ArrayList<String>();

                for (String dataItem : dataListAllItems) {
                //*This is the actual line where you can change your logic for startWith or Contains*
                    if (dataItem.toLowerCase().startsWith(searchStrLowerCase)) {
                        matchValues.add(dataItem);
                    }
                }

                results.values = matchValues;
                results.count = matchValues.size();
            }

            return results;
        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            if (results.values != null) {
                dataList = (ArrayList<String>)results.values;
            } else {
                dataList = null;
            }
            if (results.count > 0) {
                notifyDataSetChanged();
            } else {
                notifyDataSetInvalidated();
            }
        }

    }
} 

注意:您可以根据需要修改此CustomListAdapter,甚至可以在AutoCompleteTextView中放置自定义对象

使用适配器代码更新问题。这完全取决于适配器代码。在这里添加适配器代码。@ZeeshanShabbir,我已经更新了我的帖子。你能帮帮我吗?@ABDevelopers,我已经更新了我的帖子。您能帮助我吗?@Purva Naik如果您使用的是默认的ArrayAdapter,那么它应该只使用startWith过滤结果。无需使用任何自定义过滤器。
import android.content.Context;
import android.support.annotation.NonNull;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Filter;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

public class CustomListAdapter extends ArrayAdapter {

    private List<String> dataList;
    private Context mContext;
    private int itemLayout;

    private ListFilter listFilter = new ListFilter();
    private List<String> dataListAllItems;



    public CustomListAdapter(Context context, int resource, List<String> storeDataLst) {
        super(context, resource, storeDataLst);
        dataList = storeDataLst;
        mContext = context;
        itemLayout = resource;
    }

    @Override
    public int getCount() {
        return dataList.size();
    }

    @Override
    public String getItem(int position) {
        Log.d("CustomListAdapter",
                dataList.get(position));
        return dataList.get(position);
    }

    @Override
    public View getView(int position, View view, @NonNull ViewGroup parent) {

        if (view == null) {
            view = LayoutInflater.from(parent.getContext())
                    .inflate(itemLayout, parent, false);
        }

        TextView strName = (TextView) view.findViewById(R.id.textView);
        strName.setText(getItem(position));
        return view;
    }

    @NonNull
    @Override
    public Filter getFilter() {
        return listFilter;
    }

    public class ListFilter extends Filter {
        private Object lock = new Object();

        @Override
        protected FilterResults performFiltering(CharSequence prefix) {
            FilterResults results = new FilterResults();
            if (dataListAllItems == null) {
                synchronized (lock) {
                    dataListAllItems = new ArrayList<String>(dataList);
                }
            }

            if (prefix == null || prefix.length() == 0) {
                synchronized (lock) {
                    results.values = dataListAllItems;
                    results.count = dataListAllItems.size();
                }
            } else {
                final String searchStrLowerCase = prefix.toString().toLowerCase();

                ArrayList<String> matchValues = new ArrayList<String>();

                for (String dataItem : dataListAllItems) {
                //*This is the actual line where you can change your logic for startWith or Contains*
                    if (dataItem.toLowerCase().startsWith(searchStrLowerCase)) {
                        matchValues.add(dataItem);
                    }
                }

                results.values = matchValues;
                results.count = matchValues.size();
            }

            return results;
        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            if (results.values != null) {
                dataList = (ArrayList<String>)results.values;
            } else {
                dataList = null;
            }
            if (results.count > 0) {
                notifyDataSetChanged();
            } else {
                notifyDataSetInvalidated();
            }
        }

    }
} 
 CustomListAdapter autoAdapter = new CustomListAdapter(this, android.R.layout.simple_list_item_1, myData);
        AutoCompleteTextView autoText=(AutoCompleteTextView)findViewById(R.id.auto);
        autoText.setAdapter(autoAdapter);