/** * Odoo, Open Source Management Solution * Copyright (C) 2012-today Odoo SA (<http:www.odoo.com>) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http:www.gnu.org/licenses/> * * Created on 7/1/15 6:07 PM */ package com.odoo.core.support.list; import android.content.Context; import android.text.TextUtils; import android.util.Log; import android.widget.ArrayAdapter; import android.widget.Filter; import java.util.ArrayList; import java.util.List; public class OListAdapter extends ArrayAdapter<Object> { public static final String TAG = OListAdapter.class.getSimpleName(); private Context mContext = null; private List<Object> mObjects = null; private List<Object> mAllObjects = null; private RowFilter mFilter = null; private int mResourceId = 0; private RowFilterTextListener mRowFilterTextListener = null; private OnSearchChange mOnSearchChange = null; public OListAdapter(Context context, int resource, List<Object> objects) { super(context, resource, objects); Log.d(TAG, "OListAdapter->constructor()"); mContext = context; mObjects = new ArrayList<>(objects); mAllObjects = new ArrayList<>(objects); mResourceId = resource; } @Override public Filter getFilter() { if (mFilter == null) { mFilter = new RowFilter(); } return mFilter; } public int getResource() { return mResourceId; } public void replaceObjectAtPosition(int position, Object object) { mAllObjects.remove(position); mAllObjects.add(position, object); mObjects.remove(position); mObjects.add(position, object); } public void notifiyDataChange(List<Object> objects) { Log.d(TAG, "OListAdapter->notifiyDataChange()"); mAllObjects.clear(); mObjects.clear(); mAllObjects.addAll(objects); mObjects.addAll(objects); notifyDataSetChanged(); } class RowFilter extends Filter { @Override protected FilterResults performFiltering(CharSequence constraint) { FilterResults result = new FilterResults(); if (!TextUtils.isEmpty(constraint)) { String searchingStr = constraint.toString().toLowerCase(); List<Object> filteredItems = new ArrayList<Object>(); for (Object item : mAllObjects) { String filterText = ""; if (mRowFilterTextListener != null) { filterText = mRowFilterTextListener.filterCompareWith( item).toLowerCase(); } else { filterText = item.toString().toLowerCase(); } if (filterText.contains(searchingStr)) { filteredItems.add(item); } } result.count = filteredItems.size(); result.values = filteredItems; } else { synchronized (this) { result.count = mAllObjects.size(); result.values = mAllObjects; } } return result; } @SuppressWarnings("unchecked") @Override protected void publishResults(CharSequence constraint, FilterResults results) { clear(); mObjects = (List<Object>) results.values; addAll(mObjects); notifyDataSetChanged(); if (mOnSearchChange != null) { mOnSearchChange.onSearchChange(mObjects); } } } public void setOnSearchChange(OnSearchChange callback) { mOnSearchChange = callback; } public void setRowFilterTextListener(RowFilterTextListener listener) { mRowFilterTextListener = listener; } public interface RowFilterTextListener { public String filterCompareWith(Object object); } public interface OnSearchChange { public void onSearchChange(List<Object> newRecords); } }