Reputation: 81
In my app, I am using AutoCompleteTextView
which displays data after entering two character, but my problem is that after entering two character,i am getting all suggestion having those two character in word.
But, I want suggestion of only those word having 1st two character as entered.
My Main3Activity.java class
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);
}
}
and my 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>
and my application output screenshot
Upvotes: 2
Views: 749
Reputation: 1658
You can use this Custom Adapter
Create a Class 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();
}
}
}
}
Later in your Activity :
CustomListAdapter autoAdapter = new CustomListAdapter(this, android.R.layout.simple_list_item_1, myData);
AutoCompleteTextView autoText=(AutoCompleteTextView)findViewById(R.id.auto);
autoText.setAdapter(autoAdapter);
Note : You can modify this CustomListAdapter as per your need and even you can put custom objects in AutoCompleteTextView
Upvotes: 0
Reputation: 3478
To start working from first character add 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
Upvotes: -1
Reputation: 4157
Add this line to AutoCompleteTextView
:
android:completionThreshold="1"
Upvotes: 2