Monday, 26 August 2013

Search in an android listview with sublist

Search in an android listview with sublist

I am working in an android application and I am binding a listview with an
head row and sub row list. I am using two different layouts for the head
listview head row and sub item row.
I want to implement a search in this Listview which should show only the
sublist items in the listview. So to do this I have implemented implements
Filterable class to my BaseAdaptor. I got the List values correctly but
when I bind it to the ListView by calling notifyDataSetChanged, the first
row is the header. I want to show only the sub list items in the listview
and hide the header list row in search functionality. Please look into my
code and suggest me a solution.
My Adaptor class
public class CaseManagerAdaptor extends BaseAdapter implements Filterable {
private static final int TYPE_ITEM = 0;
private static final int TYPE_SEPARATOR = 1;
private static final int TYPE_MAX_COUNT = TYPE_SEPARATOR + 1;
private ValueFilter valueFilter = null;
private ArrayList<Consumer> mData = new ArrayList<Consumer>();
private ArrayList<Consumer> mDatabackup = new ArrayList<Consumer>();
private LayoutInflater mInflater;
private TreeSet<Integer> mSeparatorsSet = new TreeSet<Integer>();
public CaseManagerAdaptor(Context context) {
mInflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mDatabackup = mData;
getFilter();
}
public void addItem(final Consumer item) {
mData.add(item);
notifyDataSetChanged();
}
public void addSeparatorItem(final Consumer item) {
mData.add(item);
// save separator position
mSeparatorsSet.add(mData.size() - 1);
notifyDataSetChanged();
}
@Override
public int getItemViewType(int position) {
return mSeparatorsSet.contains(position) ? TYPE_SEPARATOR :
TYPE_ITEM;
}
@Override
public int getViewTypeCount() {
return TYPE_MAX_COUNT;
}
@Override
public int getCount() {
return mData.size();
}
@Override
public String getItem(int position) {
return mData.get(position).toString();
}
@Override
public long getItemId(int position) {
return position;
}
public static class ViewHolder {
public TextView textView1 = null;
public TextView textView2 = null;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
int type = getItemViewType(position);
System.out.println("getView " + position + " " + convertView
+ " type = " + type);
if (convertView == null) {
holder = new ViewHolder();
switch (type) {
case TYPE_ITEM:
convertView = mInflater
.inflate(R.layout.subhead_listitem, null);
holder.textView1 = (TextView) convertView
.findViewById(R.id.clientname_textView);
holder.textView2 = (TextView) convertView
.findViewById(R.id.serviceCompletedCount_textView);
break;
case TYPE_SEPARATOR:
convertView = mInflater.inflate(R.layout.head_list_item,
null);
holder.textView1 = (TextView) convertView
.findViewById(R.id.head_list_Text);
break;
}
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
if (type == TYPE_SEPARATOR)
holder.textView1.setText(mData.get(position).EmployeeName);
else {
holder.textView1.setText(mData.get(position).ClientName);
holder.textView2.setText(mData.get(position).ServiceCompletedCount);
}
return convertView;
}
// Returns a filter that can be used to constrain data with a filtering
// pattern.
@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<Consumer> filterList = new ArrayList<Consumer>();
for (int i = 0; i < mData.size(); i++) {
if (!mData.get(i).IsHeader
&&
mData.get(i).ClientName.contains(constraint))
{
filterList.add(mData.get(i));
}
}
results.count = filterList.size();
results.values = filterList;
} else {
results.count = mData.size();
results.values = mData;
results.count = mDatabackup.size();
results.values = mDatabackup;
}
return results;
}
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint,
FilterResults results) {
mData = (ArrayList<Consumer>) results.values;
notifyDataSetChanged();
}
}
}
My activity class
public class CaseManagerActivity extends Activity {
private EditText mSearchEdittext = null;
private ArrayList<Consumer> mConsumer = null;
private ListView mCaseManagerListView = null;
private List<Consumer> mOrderedConsumers = null;
private CaseManagerAdaptor mAdaptor = null;
private TextWatcher mSearchTextWatcher = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.casemanager_consumer_screen);
mSearchEdittext = (EditText)
findViewById(R.id.casemanager_search_editText);
mCaseManagerListView = (ListView)
findViewById(R.id.casemanager_listview);
try {
mConsumer =
getIntent().getParcelableArrayListExtra("lstConsumer");
if (mConsumer != null && mConsumer.size() > 0) {
mOrderedConsumers = arrangeConsumers(mConsumer);
mAdaptor = new CaseManagerAdaptor(this);
}
for (int i = 0; i < mOrderedConsumers.size(); i++) {
if (mOrderedConsumers.get(i).IsHeader) {
mAdaptor.addSeparatorItem(mOrderedConsumers.get(i));
} else {
mAdaptor.addItem(mOrderedConsumers.get(i));
}
}
mCaseManagerListView.setAdapter(mAdaptor);
} catch (Exception e) {
}
mSearchTextWatcher = new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
mAdaptor.getFilter().filter(s.toString().toUpperCase(Locale.US));
}
@Override
public void beforeTextChanged(CharSequence s, int start, int
count,
int after) {
}
@Override
public void afterTextChanged(Editable s) {
}
};
mSearchEdittext.addTextChangedListener(mSearchTextWatcher);
}

No comments:

Post a Comment