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 th
@MKJParekh did a great job!To sum up his implementation:
performFiltering()
set the condition for nulls and empty strings, and also if the constraint matches the string value of the corresponding object, then add the object to the temp List. That way you have only a "filtered" list of objects.getCount()
, getItem()
, and getView()
. Otherwise, you'll just be loading ALL the items everytime, since untimately notifyDataSetChanged()
will be called after each filtering.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.
Make sure your adapter's getItem
method returns a Friend
object
public Object getItem(int position) {
return mFriendsList.get(position);
}
Try this:
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;
private Hashtable<String, String> picturesMap = new Hashtable<String, String>();
public void setNamesAndPictures(List<String> arrayListNames, List<String> arrayPictures) {
for(int i = 0; i < arrayListNames.size(); i++){
picturesMap.put(arrayListNames.get(i), arrayPictures.get(i));
}
this.arrayListNames = arrayListNames;
}
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());
}
@Override
public int getCount() {
return arrayListNames.size();
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public void notifyDataSetChanged() {
super.notifyDataSetChanged();
}
@Override
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));
String url = picturesMap.get(arrayListNames.get(position));
if(url != null){
imageLoader.DisplayImage(url, 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;
}
}
Problem is because you are not updating the list of picture names while you filter the array based on edittext input, you also need to update them too,
I have tried to modify your code,check this
public static List<String> temparrayPictures;
public static List<String> temparrayListNames;
public class TagFriendsAdapter extends BaseAdapter implements Filterable {
List<String> arrayListNames;
List<String> arrayPictures;
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;
temparrayPictures = arrayPicture;
temparrayListNames = arrayName;
inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
imageLoader = new ImageLoader(activity.getApplicationContext());
}
public int getCount() {
return temparrayListNames.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(temparrayListNames.get(position));
if (temparrayPictures.get(position) != null){
imageLoader.DisplayImage(temparrayPictures.get(position), imgProfilePicture);
}
else if (temparrayPictures.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) {
notifyDataSetChanged();
}
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
temparrayPictures.clear();
temparrayListNames.clear();
if (temparrayListNames == null && temparrayPictures == null) {
temparrayListNames = new ArrayList<String>(arrayListNames);
temparrayPictures = new ArrayList<String>(arrayPictures);
}
if (constraint == null || constraint.length() == 0) {
results.count = arrayListNames.size();
results.values = arrayListNames;
temparrayPictures = arrayPictures;
temparrayListNames = arrayListNames;
} else {
constraint = constraint.toString().toLowerCase();
for (int i = 0; i < mOriginalNames.size(); i++) {
String dataNames = arrayName.get(i);
String picNames = arrayPicture.get(i);
if (dataNames.toLowerCase().startsWith(constraint.toString())) {
temparrayPictures.add(picNames);
temparrayListNames.add(dataNames);
}
}
results.count = temparrayListNames.size();
System.out.println(results.count);
results.values = temparrayListNames;
Log.e("VALUES", results.values.toString());
}
return results;
}
};
return filter;
}
}