I’ve my main custom listactivity class that have a instance object of my custom extended class from ArrayAdapter. My Textwatcher is picking up character and searching fine over the adapter but when I press “Backspace” or “DEL” button to remove my character, my listview gets empty instead of showing all the records..
This is my activity.
adapter = new ProjectArrayAdapter(this, titles, statuses, ids, starteds);
eTprojectsearch = (EditText) findViewById(R.id.txtprojectsearch);
eTprojectsearch.addTextChangedListener(Listener__SearchProject);
eTprojectsearch.setOnEditorActionListener(new OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if(actionId == KeyEvent.KEYCODE_DEL) {
if(eTprojectsearch.getText().toString().trim().equals("")) {
setListAdapter(adapter);
}
}
return false;
}
});
setListAdapter(adapter);
My function of Listener__SearchProject is..
private TextWatcher Listener__SearchProject = new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
adapter.getFilter().filter(s);
adapter.notifyDataSetChanged();
//notifyAll();
/*
* if(s.length() == -1) {
setListAdapter(adapter);
} else {
adapter.getFilter().filter(s,new Filter.FilterListener() {
public void onFilterComplete(int count) {
Log.i("ADAPTER:COMPLETE COUNT",String.valueOf(count));
adapter.setNotifyOnChange(true);
}
});
}
*/
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s) {
}
};
And here is my Adapter complete class with my Viewholder and etc.
public class ProjectArrayAdapter extends ArrayAdapter<String> implements Filterable {
private final Activity context;
private final List<String> titles;
private final List<String> statuses;
private final List<String> ids;
private final List<String> starteds;
ProjectFilter filter;
public final Object mLock = new Object();
ArrayList<String> items;
ArrayList<String> filteredItems;
static class PViewHolder {
public TextView title;
public TextView status;
public TextView id;
public TextView started;
}
public ProjectArrayAdapter(Activity context, List<String> titles,List<String> statuses,List<String> ids,List<String> starteds) {
super(context, R.layout.projectlist, titles);
this.context = context;
this.titles = titles;
this.statuses = statuses;
this.ids = ids;
this.starteds = starteds;
this.items = (ArrayList<String>)titles;
this.filteredItems = this.items;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View rowView = convertView;
if (rowView == null) {
LayoutInflater inflater = context.getLayoutInflater();
rowView = inflater.inflate(R.layout.projectlist, null);
PViewHolder viewHolder = new PViewHolder();
viewHolder.title = (TextView) rowView.findViewById(R.id.projecttitle);
viewHolder.status = (TextView) rowView.findViewById(R.id.projectstatus);
viewHolder.id = (TextView) rowView.findViewById(R.id.projectid);
viewHolder.started = (TextView) rowView.findViewById(R.id.projectstarted);
rowView.setTag(viewHolder);
}
PViewHolder holder = (PViewHolder) rowView.getTag();
String title = titles.get(position);
String status = statuses.get(position);
String id = ids.get(position);
String started = starteds.get(position);
holder.title.setText((title.length() > 17 ? title.substring(0, 17)+"..." : title));
holder.status.setText(status);
holder.id.setText(id);
holder.started.setText(started);
return rowView;
}
public Filter getFilter() {
if (filter == null){
filter = new ProjectFilter();
}
return filter;
}
private class ProjectFilter extends Filter {
@SuppressWarnings({ "rawtypes", "unchecked" })
@Override
protected FilterResults performFiltering(CharSequence prefix) {
FilterResults results = new FilterResults();
if (prefix == null || prefix.length() == 0) {
synchronized (mLock) {
results.values = items;
results.count = items.size();
}
} else {
synchronized(mLock) {
String prefixString = prefix.toString().toLowerCase();
final ArrayList filteredItems = new ArrayList();
final ArrayList localItems = new ArrayList();
localItems.addAll(items);
final int count = localItems.size();
for (int i = 0; i < count; i++) {
final String cString = String.valueOf(localItems.get(i));
if (cString.contains(prefixString.toLowerCase())) {
filteredItems.add(cString);
}
}
results.values = filteredItems;
results.count = filteredItems.size();
}//end synchronized
}
return results;
}
protected void publishResults(CharSequence prefix, FilterResults results) {
synchronized(mLock) {
@SuppressWarnings("unchecked")
final ArrayList<String> localItems = (ArrayList<String>) results.values;
notifyDataSetChanged();
clear();
for (Iterator<String> iterator = localItems.iterator(); iterator
.hasNext();) {
String gi = (String) iterator.next();
add(gi);
}
}//end synchronized
}
}
}
Please point me out where I’m mistaken..
ArrayList<String> itemsandArrayList<String> filteredItemsinProjectArrayAdapterandList<T> mObjects;inArrayAdapterrefer to the sameArrayListinstance. (Callclear()method ofArrayAdapter, then checkitems.size()it must be zero.)Remove this line
adapter.notifyDataSetChanged();fromonTextChangedReplace
this.items = (ArrayList<String>)titles;(in constructor) withthis.items = new ArrayList<String>(titles);publishResults()method should look like…Are you sure you need
ArrayList<String> filteredItems;inProjectArrayAdapter? Remove it unless it is necessary.