package org.wordpress.android.ui.suggestion.adapters; 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.TextView; import org.wordpress.android.R; import org.wordpress.android.models.Suggestion; import org.wordpress.android.util.GravatarUtils; import org.wordpress.android.widgets.WPNetworkImageView; import java.util.ArrayList; import java.util.List; public class SuggestionAdapter extends BaseAdapter implements Filterable { private final LayoutInflater mInflater; private Filter mSuggestionFilter; private List<Suggestion> mSuggestionList; private List<Suggestion> mOrigSuggestionList; private int mAvatarSz; public SuggestionAdapter(Context context) { mAvatarSz = context.getResources().getDimensionPixelSize(R.dimen.avatar_sz_small); mInflater = LayoutInflater.from(context); } public void setSuggestionList(List<Suggestion> suggestionList) { mOrigSuggestionList = suggestionList; } @Override public int getCount() { if (mSuggestionList == null) { return 0; } return mSuggestionList.size(); } @Override public Suggestion getItem(int position) { if (mSuggestionList == null) { return null; } return mSuggestionList.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { final SuggestionViewHolder holder; if (convertView == null || convertView.getTag() == null) { convertView = mInflater.inflate(R.layout.suggestion_list_row, parent, false); holder = new SuggestionViewHolder(convertView); convertView.setTag(holder); } else { holder = (SuggestionViewHolder) convertView.getTag(); } Suggestion suggestion = getItem(position); if (suggestion != null) { String avatarUrl = GravatarUtils.fixGravatarUrl(suggestion.getImageUrl(), mAvatarSz); holder.imgAvatar.setImageUrl(avatarUrl, WPNetworkImageView.ImageType.AVATAR); holder.txtUserLogin.setText("@" + suggestion.getUserLogin()); holder.txtDisplayName.setText(suggestion.getDisplayName()); } return convertView; } @Override public Filter getFilter() { if (mSuggestionFilter == null) { mSuggestionFilter = new SuggestionFilter(); } return mSuggestionFilter; } private class SuggestionViewHolder { private final WPNetworkImageView imgAvatar; private final TextView txtUserLogin; private final TextView txtDisplayName; SuggestionViewHolder(View row) { imgAvatar = (WPNetworkImageView) row.findViewById(R.id.suggest_list_row_avatar); txtUserLogin = (TextView) row.findViewById(R.id.suggestion_list_row_user_login_label); txtDisplayName = (TextView) row.findViewById(R.id.suggestion_list_row_display_name_label); } } private class SuggestionFilter extends Filter { @Override protected FilterResults performFiltering(CharSequence constraint) { FilterResults results = new FilterResults(); if (mOrigSuggestionList == null) { results.values = null; results.count = 0; } else if (constraint == null || constraint.length() == 0) { results.values = mOrigSuggestionList; results.count = mOrigSuggestionList.size(); } else { List<Suggestion> nSuggestionList = new ArrayList<Suggestion>(); for (Suggestion suggestion : mOrigSuggestionList) { String lowerCaseConstraint = constraint.toString().toLowerCase(); if (suggestion.getUserLogin().toLowerCase().startsWith(lowerCaseConstraint) || suggestion.getDisplayName().toLowerCase().startsWith(lowerCaseConstraint) || suggestion.getDisplayName().toLowerCase().contains(" " + lowerCaseConstraint)) nSuggestionList.add(suggestion); } results.values = nSuggestionList; results.count = nSuggestionList.size(); } return results; } @SuppressWarnings("unchecked") @Override protected void publishResults(CharSequence constraint, FilterResults results) { if (results.count == 0) notifyDataSetInvalidated(); else { mSuggestionList = (List<Suggestion>) results.values; notifyDataSetChanged(); } } @Override public CharSequence convertResultToString (Object resultValue) { Suggestion suggestion = (Suggestion) resultValue; return suggestion.getUserLogin(); } } }