Reputation: 226
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
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