Search code examples
androidbaseadapterandroid-filterable

Filtering ListView extending BaseAdapter


In my application I retrieve all the names of restaurants from the parse database and I added a search bar on the top of my list so I can search for names in my list.I have a problem in the ListViewAdpater.

public class ListViewAdapter extends BaseAdapter implements Filterable {
// Declare Variables
Context mContext;
LayoutInflater inflater;
//private List<Names> namelist =     null;

// private ArrayList arraylist; private Filter filter;

private List<Names> originalData = null;
private List<Names> filteredData = null;


public ListViewAdapter(Activity context, List<Names> namelist) {

    inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    this.filteredData = namelist;
    this.originalData = namelist;
    mContext = context;
}

public class ViewHolder {
    TextView name;
}

@Override
public int getCount() {
    return filteredData.size();
}

@Override
public Object getItem(int position) {
    return filteredData.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}


public View getView(final int position, View view, ViewGroup parent) {
    final ViewHolder holder;
    if (view == null) {
        holder = new ViewHolder();
        view = inflater.inflate(R.layout.listview_item, null);
        // Locate the TextView in listview_item.xml
        holder.name = (TextView) view.findViewById(R.id.name);
        view.setTag(holder);
    } else {
        holder = (ViewHolder) view.getTag();
    }
    // Set the results into TextView
    holder.name.setText(filteredData.get(position).getName());
    // Listen for ListView Item Click
    view.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // Send single item click data to SingleItemView Class
            Intent intent = new Intent(mContext, SingleItemView.class);
            // Pass all data number
            intent.putExtra("name", (filteredData.get(position).getName()));
            // Start SingleItemView Class
            mContext.startActivity(intent);
        }
    });
    return view;
}


@Override
public Filter getFilter() {
    if (filter == null) filter = new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            String constraintStr = constraint.toString().toLowerCase(Locale.getDefault());
            FilterResults result = new FilterResults();

            if (constraintStr != null & constraintStr.length() > 0) {
                ArrayList<Names> filterItems = new ArrayList<Names>();

                synchronized (this) {
                    for (Names item : originalData) {
                        if (item.getName().toLowerCase(Locale.getDefault()).startsWith(constraintStr)) {
                            filterItems.add(item);
                        }
                    }
                    result.count = filterItems.size();
                    result.values = filterItems;
                }
            } else {
                synchronized (this) {
                    result.count = originalData.size();
                    result.values = originalData;
                }
            }
            return result;

        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {

            if (results.values != null) {
                filteredData= (List<Names>) results.values;
                notifyDataSetChanged();
            }

        }
    };
    return filter;
}

Solution

  • Use two arraylist one for original data and other is filtering.

    update your adapter constructor .

        private ArrayList<Names> originalData = null;
                private ArrayList<Names> filteredData = null;
    
                public adapter(Activity c, ArrayList<Names> list) {
                    infalter = (LayoutInflater) c
                            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    
                    this.filteredData = list;
                    this.originalData = list;
                    mContext = c;
                }
    
    
         @Override
            public int getCount() {
                return filteredData.size();
            }
    
            @Override
            public Object getItem(int position) {
                return filteredData.get(position);
            }
    

    On Filter

    @Override
    public Filter getFilter() {
        if (filter == null) filter = new Filter() {
              @Override
                protected FilterResults performFiltering(CharSequence constraint) {
                  String constraintStr = constraint.toString().toLowerCase(Locale.getDefault());
                            FilterResults result = new FilterResults();
    
                            if (constraintStr != null & constraintStr.length() > 0) {
                               ArrayList<Names> filterItems = new ArrayList<Names>();
    
                                synchronized (this) {
                                    for (ContactInfo item : originalData) {
                                        if (item.name.toLowerCase(Locale.getDefault()).startsWith(constraintStr)) {
                                            filterItems.add(item);
                                        }
                                    }
                                    result.count = filterItems.size();
                                    result.values = filterItems;
                                }
                            } else {
                                synchronized (this) {
                                    result.count = originalData.size();
                                    result.values = originalData;
                                }
                            }
                            return result;
    
        }
    
            @Override
            protected void publishResults(CharSequence constraint, FilterResults results) {
    
                if (results.values != null) {
                    namelist = (List<Names>) results.values;
                    notifyDataSetChanged();
                }
    
            }
        };
        return filter;
    }