package com.feebe.lib; import android.content.Context; import android.os.AsyncTask; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.BaseAdapter; import android.widget.Filter; import android.widget.Filterable; import android.widget.Toast; import java.util.ArrayList; import java.util.Arrays; import java.util.Hashtable; import java.util.Iterator; import java.util.List; import java.util.Comparator; import java.util.Collections; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; public abstract class UrlArrayAdapter<T, W> extends ArrayAdapter<T> { /** * Constructor * * @param context The current context. * @param resource The resource ID for a layout file containing * a layout to use when instantiating views. */ public UrlArrayAdapter(Context context, int resource) { super(context, resource); mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); mResource = resource; } /** * Constructor * * @param context The current context. * @param resource The resource ID for a layout file * containing a layout to use when instantiating views. * @param objects The objects to represent in the ListView. */ public UrlArrayAdapter(Context context, int resource, T[] objects) { super(context, resource, objects); mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); mResource = resource; } /** * Constructor * * @param context The current context. * @param resource The resource ID for a layout file containing a * layout to use when instantiating views. * @param objects The objects to represent in the ListView. */ public UrlArrayAdapter( Context context, int resource, List<T> objects) { super(context, resource, objects); mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); mResource = resource; } public abstract W getWrapper(View v); public abstract void applyWrapper(T item, W wp, boolean newView); protected LayoutInflater mInflater; protected int mResource; @SuppressWarnings("unchecked") @Override public View getView(int position, View convertView, ViewGroup parent) { boolean newView; View view = convertView; W w; if (view != null) { w = (W) view.getTag(); if (w == null) { view = null; } } if (view == null) { view = mInflater.inflate(mResource, parent, false); w = getWrapper(view); newView = true; } else { newView = false; w = (W) view.getTag(); } T item = getItem(position); applyWrapper(item, w, newView); return view; } protected void onNoResult(){ Const.noResultToast(); } protected boolean useDedup_ = true; public boolean runList(List entries) { if (useDedup_) entries = Util.dedup(entries); if(entries == null) return false; int len = entries.size(); if (len == 0) { return false; } for(int i = 0; i < len; i++){ T obj = getT(entries.get(i)); if (obj != null) { add(obj); } } return true; } protected abstract List getListFromUrl(final String url, final long expire); protected abstract T getT(Object obj); public boolean runSyn(final String url, final long expire) { List list = getListFromUrl(url, expire); if (list != null) { return runList(list); } else { onNoResult(); } return false; } protected void runAsyn(final String url, final long expire) { new AppendTask(expire).execute(url); } protected void dismissProgressDialog() { } @SuppressWarnings("unchecked") public class AppendTask extends AsyncTask<String, Void, List> { Long expire; AppendTask(long e) { expire = e; } @Override protected List doInBackground(String... url) { return getListFromUrl(url[0], expire); } @Override protected void onPostExecute(List result) { onPost(result); } protected void onPost(List result) { dismissProgressDialog(); if (result != null) { runList(result); }else { onNoResult(); } } } }