funkycookie
funkycookie

Reputation: 226

Filter ListView using EditText

Basically I'm trying to filter a ListView using an EditText. I manage to store all the filtered results but seems like I'm missing something since the UI is not updated and it's not displaying anything on text changed. Any indications? Thanks

import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ImageView;
import android.widget.TextView;

import com.enloop.R;

import java.util.ArrayList;

public class FriendsWithMeAdapter extends BaseAdapter implements Filterable {
    private Context mContext;
    private ArrayList<FriendsModel> friend;
    private ArrayList<FriendsModel> items = new ArrayList<FriendsModel>();
    private ArrayList<FriendsModel> suggestions = new ArrayList<FriendsModel>();

    public FriendsWithMeAdapter(Context c, ArrayList<FriendsModel> ai) {
        mContext = c;
        friend = ai;
    }

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

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

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            LayoutInflater mInflater = (LayoutInflater)
                    mContext.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
            convertView = mInflater.inflate(R.layout.item_friend, null);
        }
        ImageView userImage = (ImageView) convertView.findViewById(R.id.invited_friend_picture);
        ImageView checkImage = (ImageView) convertView.findViewById(R.id.invite_friends_check);
        TextView name = (TextView) convertView.findViewById(R.id.invited_friend_name);
        TextView userName = (TextView) convertView.findViewById(R.id.invited_friend_name);

        userImage.setImageBitmap(friend.get(position).getUserImage());
        checkImage.setImageResource(friend.get(position).isWithMe() ?
                R.drawable.btn_checkmark_round_tiny : R.drawable.btn_before_checkmark_round_tiny);

        String userEnloopNameString = friend.get(position).getName();
        name.setText(userNameString);


        String userNameString = friend.get(position).getUserName();
        if (userNameString.length() > 12) {
            userNameString = userNameString.substring(0, 10);
            userNameString += "..";
        }
        userName.setText(userNameString);

        return convertView;
    }

    @Override
    public Filter getFilter() {
        Filter filter = new Filter() {

            @Override
            protected FilterResults performFiltering(CharSequence constraint) {

                FilterResults results = new FilterResults();

                if (constraint == null && constraint.length() == 0) {
                    results.values = friend;
                    results.count = friend.size();
                } else {
                    for (FriendsModel item : friend) {
                        if (item.getName().toLowerCase().contains(constraint.toString().toLowerCase()))
                            suggestions.add(item);
                    }
                    results.values = suggestions;
                    results.count = suggestions.size();
                }

                return results;
            }


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

                if (results.count == 0) {
                    notifyDataSetInvalidated();
                } else {
                    items = (ArrayList<FriendsModel>) results.values;
                }
            }
        };
        return filter;
    }
}




mSearch.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                adapter.getFilter().filter(s.toString());
            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });

Upvotes: 0

Views: 124

Answers (1)

Hareshkumar Chhelana
Hareshkumar Chhelana

Reputation: 24848

Try this way,hope this will help you to solve your problem.

mSearch.addTextChangedListener(new TextWatcher() {
      @Override
      public void beforeTextChanged(CharSequence s, int start, int count, int after) {

      }

      @Override
      public void onTextChanged(CharSequence s, int start, int before, int count) {

      }

      @Override
      public void afterTextChanged(Editable s) {
           adapter.filter(text);
      }
});

Here use two list one for original data and another one for filtered data please keep mind you can not use (=)assignment for filtered data if you do this way then you filtered data also alter original data too,filtered data use to shown list list item so you have to use addAll() instead (=) assignment which is not altered original data and whenever you use custom adapter try to use ViewHolder pattern.

public class FriendsWithMeAdapter extends BaseAdapter implements Filterable {
    private Context mContext;
    private ArrayList<FriendsModel> friend;
    private ArrayList<FriendsModel> suggestions = new ArrayList<FriendsModel>();

    public FriendsWithMeAdapter(Context mContext, ArrayList<FriendsModel> friend) {
        this.mContext = mContext;
        this.friend = friend;
        suggestions =new ArrayList<FriendsModel>();
        suggestions.addAll(friend);
    }

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

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

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            holder = new ViewHolder();
            convertView =  LayoutInflater.from(mContext).inflate(R.layout.item_friend, null);
            holder.userImage = (ImageView) convertView.findViewById(R.id.invited_friend_picture);
            holder.checkImage = (ImageView) convertView.findViewById(R.id.invite_friends_check);
            holder.name = (TextView) convertView.findViewById(R.id.invited_friend_name);
            holder.userName = (TextView) convertView.findViewById(R.id.invited_friend_name);

            convertView.setTag(holder);

        }else{
            holder = (ViewHolder) convertView.getTag();
        }


        holder.userImage.setImageBitmap(suggestions.get(position).getUserImage());
        holder.checkImage.setImageResource(suggestions.get(position).isWithMe() ?
                R.drawable.btn_checkmark_round_tiny : R.drawable.btn_before_checkmark_round_tiny);

        String userEnloopNameString = suggestions.get(position).getName();
        holder.name.setText(userNameString);


        String userNameString = suggestions.get(position).getUserName();
        if (userNameString.length() > 12) {
            userNameString = userNameString.substring(0, 10);
            userNameString += "..";
        }
        holder.userName.setText(userNameString);

        return convertView;
    }

    public void filter(String charText) {
        suggestions.clear();
        if (charText.length() == 0) {
            suggestions.addAll(friend);
        }else{
            for (FriendsModel item : friend) {
                if (item.getName().toLowerCase().contains(constraint.toString().toLowerCase()))
                    suggestions.add(item);
            }
        }
        notifyDataSetChanged();
    }


    public class ViewHolder {
        ImageView userImage;
        ImageView checkImage;
        TextView name;
        TextView userName;
    }
}

Upvotes: 1

Related Questions