package io.github.mthli.Ninja.View; import android.content.Context; import android.text.Html; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.*; import io.github.mthli.Ninja.Database.Record; import io.github.mthli.Ninja.R; import io.github.mthli.Ninja.Unit.BrowserUnit; import java.util.*; public class CompleteAdapter extends BaseAdapter implements Filterable { private class CompleteFilter extends Filter { @Override protected FilterResults performFiltering(CharSequence prefix) { if (prefix == null) { return new FilterResults(); } resultList.clear(); for (CompleteItem item : originalList) { if (item.getTitle().contains(prefix) || item.getURL().contains(prefix)) { if (item.getTitle().contains(prefix)) { item.setIndex(item.getTitle().indexOf(prefix.toString())); } else if (item.getURL().contains(prefix)) { item.setIndex(item.getURL().indexOf(prefix.toString())); } resultList.add(item); } } Collections.sort(resultList, new Comparator<CompleteItem>() { @Override public int compare(CompleteItem first, CompleteItem second) { if (first.getIndex() < second.getIndex()) { return -1; } else if (first.getIndex() > second.getIndex()) { return 1; } else { return 0; } } }); FilterResults results = new FilterResults(); results.values = resultList; results.count = resultList.size(); return results; } @Override protected void publishResults(CharSequence constraint, FilterResults results) { notifyDataSetChanged(); } } private class CompleteItem { private String title; protected String getTitle() { return title; } private String url; protected String getURL() { return url; } private int index = Integer.MAX_VALUE; protected int getIndex() { return index; } protected void setIndex(int index) { this.index = index; } protected CompleteItem(String title, String url) { this.title = title; this.url = url; } @Override public boolean equals(Object object) { if (!(object instanceof CompleteItem)) { return false; } CompleteItem item = (CompleteItem) object; return item.getTitle().equals(title) && item.getURL().equals(url); } @Override public int hashCode() { if (title == null || url == null) { return 0; } return title.hashCode() & url.hashCode(); } } private static class Holder { protected TextView titleView; protected TextView urlView; } private Context context; private int layoutResId; private List<CompleteItem> originalList; private List<CompleteItem> resultList; private CompleteFilter filter = new CompleteFilter(); public CompleteAdapter(Context context, int layoutResId, List<Record> recordList) { this.context = context; this.layoutResId = layoutResId; this.originalList = new ArrayList<>(); this.resultList = new ArrayList<>(); dedup(recordList); } private void dedup(List<Record> recordList) { for (Record record : recordList) { if (record.getTitle() != null && !record.getTitle().isEmpty() && record.getURL() != null && !record.getURL().isEmpty()) { originalList.add(new CompleteItem(record.getTitle(), record.getURL())); } } Set<CompleteItem> set = new HashSet<>(originalList); originalList.clear(); originalList.addAll(set); } @Override public int getCount() { return resultList.size(); } @Override public Filter getFilter() { return filter; } @Override public Object getItem(int position) { return resultList.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { View view = convertView; Holder holder; if (view == null) { view = LayoutInflater.from(context).inflate(layoutResId, null, false); holder = new Holder(); holder.titleView = (TextView) view.findViewById(R.id.complete_item_title); holder.urlView = (TextView) view.findViewById(R.id.complete_item_url); view.setTag(holder); } else { holder = (Holder) view.getTag(); } CompleteItem item = resultList.get(position); holder.titleView.setText(item.getTitle()); if (item.getURL() != null) { holder.urlView.setText(Html.fromHtml(BrowserUnit.urlWrapper(item.getURL())), TextView.BufferType.SPANNABLE); } else { holder.urlView.setText(item.getURL()); } return view; } }