Filtering a ListView with Baseadapter filters text not images

android, baseadapter, filtering

Solution

First refactor your code. Create a class that holds name, picture and other friend data together.

class Friend {
    public String name;
    public String picture;
    ... /* more members and access methods*/
};

Then modify your adapter and filtering code accordingly.

`FilterResults` should contain the `ArrayList<Friend>`, i.e. a list of `Friend` objects and not just the names.

In Adapter, replace

`List<String> arrayListNames;` `List<String> arrayPictures;`

with

`List<Friend> friendsList;`

Change the `getView` method to access data from the `friendsList` object list.

After these changes the code will look better and work better.

Update:

Make sure your adapter's `getItem` method returns a `Friend` object

public Object getItem(int position) {
    return mFriendsList.get(position);
}

Problem

There was some progress made to the earlier problem. Now there is a new problem. The text in the GridView shows the correct result. However, the images are the same as at the start of the list. For example: If I search for "Sidd" it displays three results but the photos still start as for the users starting with "A". Attached is a screenshot for clarity. This is the BaseAdapter code: ``` public class TagFriendsAdapter extends BaseAdapter implements Filterable { List<String> arrayListNames; List<String> mOriginalNames; List<String> arrayPictures; List<String> mOriginalPictures; Activity activity; String[] fetFriendID; String[] fetFriendName; String[] fetFriendPicture; LayoutInflater inflater = null; ImageLoader imageLoader; TagFriendsAdapter(Activity a, String[] stringUID, String[] stringName, String[] stringPicture, ArrayList<String> arrayName, ArrayList<String> arrayPicture) { activity = a; fetFriendID = stringUID; fetFriendName = stringName; fetFriendPicture = stringPicture; this.arrayListNames = arrayName; this.arrayPictures = arrayPicture; inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); imageLoader = new ImageLoader(activity.getApplicationContext()); } public int getCount() { return arrayListNames.size(); } public Object getItem(int position) { return position; } public long getItemId(int position) { return position; } @Override public void notifyDataSetChanged() { super.notifyDataSetChanged(); } public View getView(final int position, View convertView, ViewGroup parent) { View vi = convertView; if(convertView == null) vi = inflater.inflate(R.layout.friends_grid_items, null); ImageView imgProfilePicture = (ImageView)vi.findViewById(R.id.imgProfilePicture); TextView txtUserName = (TextView)vi.findViewById(R.id.txtUserName); txtUserName.setText(arrayListNames.get(position)); if (arrayPictures.get(position) != null){ imageLoader.DisplayImage(arrayPictures.get(position), imgProfilePicture); } else if (arrayPictures.get(position) == null) { imgProfilePicture.setVisibility(View.GONE); } return vi; } @Override public Filter getFilter() { Filter filter = new Filter() { @SuppressWarnings("unchecked") @Override protected void publishResults(CharSequence constraint, FilterResults results) { arrayListNames = (List<String>) results.values; notifyDataSetChanged(); } @Override protected FilterResults performFiltering(CharSequence constraint) { FilterResults results = new FilterResults(); ArrayList<String> FilteredArrayNames = new ArrayList<String>(); if (mOriginalNames == null && mOriginalPictures == null) { mOriginalNames = new ArrayList<String>(arrayListNames); mOriginalPictures = new ArrayList<String>(arrayPictures); } if (constraint == null || constraint.length() == 0) { results.count = mOriginalNames.size(); results.values = mOriginalNames; } else { constraint = constraint.toString().toLowerCase(); for (int i = 0; i < mOriginalNames.size(); i++) { String dataNames = mOriginalNames.get(i); if (dataNames.toLowerCase().startsWith(constraint.toString())) { FilteredArrayNames.add(dataNames); } } results.count = FilteredArrayNames.size(); System.out.println(results.count); results.values = FilteredArrayNames; Log.e("VALUES", results.values.toString()); } return results; } }; return filter; } } ``` And the screenshot:

Original source