package com.door43.translationstudio.newui.newtranslation; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.Filter; import android.widget.TextView; import com.door43.translationstudio.R; import com.door43.translationstudio.core.TargetLanguage; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.List; /** * Created by joel on 9/4/2015. */ public class TargetLanguageAdapter extends BaseAdapter { private TargetLanguage[] mTargetLanguages; private TargetLanguage[] mFilteredTargetLanguages; private TargetLanguageFilter mTargetLanguageFilter; public TargetLanguageAdapter(TargetLanguage[] targetLanguages) { List<TargetLanguage> targetLanguagesList = Arrays.asList(targetLanguages); Collections.sort(targetLanguagesList); mTargetLanguages = targetLanguagesList.toArray(new TargetLanguage[targetLanguagesList.size()]); mFilteredTargetLanguages = mTargetLanguages; } @Override public int getCount() { if(mFilteredTargetLanguages != null) { return mFilteredTargetLanguages.length; } else { return 0; } } @Override public TargetLanguage getItem(int position) { return mFilteredTargetLanguages[position]; } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { View v = convertView; ViewHolder holder; if(convertView == null) { v = LayoutInflater.from(parent.getContext()).inflate(R.layout.fragment_language_list_item, null); holder = new ViewHolder(v); } else { holder = (ViewHolder)v.getTag(); } // render view holder.mLanguageView.setText(getItem(position).name); holder.mCodeView.setText(getItem(position).code); return v; } /** * Returns the target language filter * @return */ public Filter getFilter() { if(mTargetLanguageFilter == null) { mTargetLanguageFilter = new TargetLanguageFilter(); } return mTargetLanguageFilter; } public static class ViewHolder { public TextView mLanguageView; public TextView mCodeView; public ViewHolder(View view) { mLanguageView = (TextView) view.findViewById(R.id.languageName); mCodeView = (TextView) view.findViewById(R.id.languageCode); view.setTag(this); } } private class TargetLanguageFilter extends Filter { @Override protected FilterResults performFiltering(CharSequence charSequence) { FilterResults results = new FilterResults(); if(charSequence == null || charSequence.length() == 0) { // no filter results.values = Arrays.asList(mTargetLanguages); results.count = mTargetLanguages.length; } else { // perform filter List<TargetLanguage> filteredCategories = new ArrayList<>(); for(TargetLanguage language:mTargetLanguages) { // match the target language id boolean match = language.getId().toLowerCase().startsWith(charSequence.toString().toLowerCase()); if(!match) { if (language.name.toLowerCase().startsWith(charSequence.toString().toLowerCase())) { // match the target language name match = true; } } if(match) { filteredCategories.add(language); } } results.values = filteredCategories; results.count = filteredCategories.size(); } return results; } @Override protected void publishResults(CharSequence charSequence, FilterResults filterResults) { List<TargetLanguage> filteredLanguages = (List<TargetLanguage>)filterResults.values; if(charSequence != null && charSequence.length() > 0) { sortTargetLanguages(filteredLanguages, charSequence); } mFilteredTargetLanguages = filteredLanguages.toArray(new TargetLanguage[filteredLanguages.size()]); notifyDataSetChanged(); } } /** * Sorts target languages by id * @param languages * @param referenceId languages are sorted according to the reference id */ private static void sortTargetLanguages(List<TargetLanguage> languages, final CharSequence referenceId) { Collections.sort(languages, new Comparator<TargetLanguage>() { @Override public int compare(TargetLanguage lhs, TargetLanguage rhs) { String lhId = lhs.getId(); String rhId = rhs.getId(); // give priority to matches with the reference if(lhId.startsWith(referenceId.toString().toLowerCase())) { lhId = "!" + lhId; } if(rhId.startsWith(referenceId.toString().toLowerCase())) { rhId = "!" + rhId; } return lhId.compareToIgnoreCase(rhId); } }); } }