How could i filter the listview using baseadapter
Here you go. A simple baseadapter (no view recycling) that will display, and filter, a list of some custom arbitary object. In this example Object.name is the field we will use to filter.
1) In your activity, (or) where you create your ListView, enable text filtering:
class MyObject {
public String name;
}
List<MyObject> myData = ArrayList<>();
listview.setTextFilterEnabled(true);
2) As you already noted, in a textwatcher of an Edittext, trigger the filter on the ListAdapter:
public void onTextChanged(CharSequence s, int start, int before, int count) {
listadapter.getFilter().filter(s);
}
3) in your baseadapter, implement Filterable
. And store two copies of the data, one original, and one filtered. Be sure to access the filtered data throughout the BaseAdapter, not the unfiltered data
public class FilterableListAdapterExample extends BaseAdapter implements Filterable {
private List<MyObject> mData; //the original data
private List<MyObject> mDataFiltered;//the filtered data
private LayoutInflater mLayoutInflater;
public FilterableListAdapterExample(Context context, List<MyObject> data) {
mData = data;
mDataFiltered=data;
mLayoutInflater = LayoutInflater.from(context);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
convertView= mLayoutInflater.inflate(R.layout.listview_item, null);
TextView textview=(TextView)convertView.findViewById(R.id.listitem_textview);
//note: we access mDataFiltered, not mData
textview.setText(mDataFiltered.get(position).name);
return convertView;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getCount() {
return mDataFiltered.size();
}
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
if (constraint == null || constraint.length() == 0) {
//no constraint given, just return all the data. (no search)
results.count = mData.size();
results.values = mData;
} else {//do the search
List<MyObject> resultsData = new ArrayList<>();
String searchStr = constraint.toString().toUpperCase();
for (MyObject o : mData)
if (o.name.toUpperCase().startsWith(searchStr)) resultsData.add(o);
results.count = resultsData.size();
results.values = resultsData;
}
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
mDataFiltered = (ArrayList<MyObject>) results.values;
notifyDataSetChanged();
}
};
}
}
MainActivity.java
public class MainActivity extends Activity {
private ListView mListView;
private CustomAdapter mCustomAdapter;
private EditText mEditText;
private ArrayList<Contacts> _Contacts = new ArrayList<Contacts>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
for (int i = 0; i < 100; i++) {
Contacts contacts = new Contacts();
contacts.setId(""+i);
contacts.setName("Name "+i);
_Contacts.add(contacts);
}
mListView = (ListView) findViewById(R.id.listView1);
mEditText = (EditText) findViewById(R.id.editText1);
mCustomAdapter = new CustomAdapter(MainActivity.this, _Contacts);
mListView.setAdapter(mCustomAdapter);
mEditText.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
mCustomAdapter.getFilter().filter(arg0);
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
int arg3) {
}
@Override
public void afterTextChanged(Editable arg0) {
}
});
}
}
CustomAdapter.java
public class CustomAdapter extends BaseAdapter implements Filterable{
private ArrayList<Contacts> _Contacts;
private Activity context;
private LayoutInflater inflater;
private ValueFilter valueFilter;
private ArrayList<Contacts> mStringFilterList;
public CustomAdapter(Activity context, ArrayList<Contacts> _Contacts) {
super();
this.context = context;
this._Contacts = _Contacts;
mStringFilterList = _Contacts;
this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
getFilter();
}
@Override
public int getCount() {
return _Contacts.size();
}
@Override
public Object getItem(int position) {
return _Contacts.get(position).getName();
}
@Override
public long getItemId(int position) {
return 0;
}
public class ViewHolder {
TextView tname, tplace;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
convertView = inflater.inflate(R.layout.activity_main, null);
holder.tname = (TextView) convertView.findViewById(R.id.textView1);
holder.tplace = (TextView) convertView.findViewById(R.id.textView2);
convertView.setTag(holder);
} else
holder = (ViewHolder) convertView.getTag();
holder.tname.setText("" + _Contacts.get(position).getName());
holder.tplace.setText("" + "" + _Contacts.get(position).getId());
return convertView;
}
@Override
public Filter getFilter() {
if(valueFilter==null) {
valueFilter=new ValueFilter();
}
return valueFilter;
}
private class ValueFilter extends Filter {
//Invoked in a worker thread to filter the data according to the constraint.
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results=new FilterResults();
if(constraint!=null && constraint.length()>0){
ArrayList<Contacts> filterList=new ArrayList<Contacts>();
for(int i=0;i<mStringFilterList.size();i++){
if((mStringFilterList.get(i).getName().toUpperCase())
.contains(constraint.toString().toUpperCase())) {
Contacts contacts = new Contacts();
contacts.setName(mStringFilterList.get(i).getName());
contacts.setId(mStringFilterList.get(i).getId());
filterList.add(contacts);
}
}
results.count=filterList.size();
results.values=filterList;
}else{
results.count=mStringFilterList.size();
results.values=mStringFilterList;
}
return results;
}
//Invoked in the UI thread to publish the filtering results in the user interface.
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint,
FilterResults results) {
_Contacts=(ArrayList<Contacts>) results.values;
notifyDataSetChanged();
}
}
}
Contacts.java
public class Contacts {
private String name;
private String id;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<EditText
android:id="@+id/editText1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10" >
<requestFocus />
</EditText>
<ListView
android:id="@+id/listView1"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</ListView>
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="2dp"
android:layout_marginLeft="1dp"
android:layout_marginRight="1dp"
android:layout_marginTop="2dp"
android:background="@android:color/black"
android:gravity="center_vertical"
android:paddingBottom="2dp"
android:paddingTop="2dp"
tools:context=".MainActivity" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:text="Large Text"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textColor="@android:color/white" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:text="Small Text"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="@android:color/white" />
This is a sample project code. Use this code this will really help you