0

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;
}
SreeAndroidDev
  • 141
  • 1
  • 1
  • 11
F.J
  • 5
  • 4

1 Answers1

0

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;
}
Sree Reddy Menon
  • 1,231
  • 13
  • 23
  • 1
    I still have a problem with the 'name' in this line of code 'if (item.name.toLowerCase(Locale.getDefault()).startsWith(constraintStr))' – F.J Feb 22 '16 at 20:33
  • I posted the code of the whole class...Thank you for support – F.J Feb 22 '16 at 20:36
  • Its. Item.getName().. we are checking whether searched string is listed our arraylist or not. You can use .startswith . Or contains.. – Sree Reddy Menon Feb 22 '16 at 21:05
  • holder.name.setText(filteredData.get(position).getName()); – SreeAndroidDev Feb 22 '16 at 21:19
  • sorry dude it not working.The code is not filtering the data. I posted the full ListViewApadter code in the edited version of my question. Regards – F.J Feb 22 '16 at 21:28
  • void publishResults(CharSequence constraint, FilterResults results) { if (results.values != null) { filteredData = (List) results.values; notifyDataSetChanged(); } – SreeAndroidDev Feb 22 '16 at 21:33
  • Please comment yout namelist variable. Either use filitereddata list in throught adapter or namelist. You gave filtereddata list to adapter. On filter you are using namelist – SreeAndroidDev Feb 22 '16 at 21:34
  • I have updated question with changes in code..Pleade do check. – SreeAndroidDev Feb 22 '16 at 21:41