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

问题描述 投票:1回答:3

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

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

我的Main3Activity.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);
    }
}

和我的Main3Activity.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>

my application output screenshot

android xml autocompletetextview
3个回答
0
投票

将此行添加到AutoCompleteTextView

android:completionThreshold="1"

0
投票

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

创建一个类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 autoAdapter = new CustomListAdapter(this, android.R.layout.simple_list_item_1, myData);
        AutoCompleteTextView autoText=(AutoCompleteTextView)findViewById(R.id.auto);
        autoText.setAdapter(autoAdapter);

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


-1
投票

要从第一个角色开始工作,请添加autoCtextView.setThreshold(1);

AutoCompleteTextView autoCtextView= (AutoCompleteTextView)findViewById(R.id.autoCompleteTextView);  
autoCtextView.setThreshold(1);  //to start working from first character  
autoCtextView.setAdapter(adapter);  //set the adapter data to the AutoCompleteTextView  
© www.soinside.com 2019 - 2024. All rights reserved.