Cómo implementar getfilter () con un adaptador personalizado que amplía el baseadapter

aquí está mi actividad principal

package com.javacodegeeks.android.lbs; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.widget.Toast; import lbs.promotion.*; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import org.apache.http.NameValuePair; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import android.app.Activity; import android.app.ProgressDialog; import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; import android.util.Log; import android.view.View; import android.widget.AdapterView; import android.widget.EditText; import android.widget.ListView; import android.widget.AdapterView.OnItemClickListener; public class Curve extends Activity { private ProgressDialog pDialog; JSONParser jParser = new JSONParser(); ArrayList<HashMap> DaftarPromotion = new ArrayList<HashMap>(); private static String url_daftar_promotion = "http://10.0.2.2/webserver_maaug/promotion/daftar_promotion.php"; String lon = "101.5178"; String lat = "3.0724"; public static final String TAG_SUCCESS = "success"; public static final String TAG_DAFTAR_PROMOTION = "daftar_promotion"; public static final String TAG_ID_PROMO = "PromoID"; public static final String TAG_NAMA_PROMO = "PromoName"; public static final String TAG_LINK_IMAGE_PROMO = "PromoImage"; public static final String TAG_DESC_PROMO= "PromoDesc"; public static final String TAG_CATE_PROMO = "PromoCate"; public static final String TAG_CONT_PROMO = "PromoContact"; public static final String TAG_DATES_PROMO = "PromoDateStart"; public static final String TAG_DATEE_PROMO = "PromoDateEnd"; JSONArray daftar_promotion = null; ListView list; PromotionListAdapter adapter; EditText inputSearch; private Curve activity; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_curve); DaftarPromotion = new ArrayList<HashMap>(); new Activity().execute(); activity = this; list = (ListView) findViewById(R.id.list); inputSearch = (EditText) findViewById(R.id.search_box); inputSearch.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) { // When user changed the Text Curve.this.adapter.getFilter().filter(cs); } @Override public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { // TODO Auto-generated method stub } @Override public void afterTextChanged(Editable arg0) { // TODO Auto-generated method stub } }); list.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { HashMap map = DaftarPromotion.get(position); String pna = map.get(TAG_NAMA_PROMO); String pde = map.get(TAG_DESC_PROMO); String pca = map.get(TAG_CATE_PROMO); String pcon = map.get(TAG_CONT_PROMO); String pds = map.get(TAG_DATES_PROMO); String pdae = map.get(TAG_DATEE_PROMO); Toast.makeText(Curve.this, pna +"\n" + pde +"\n" + pca +"\n" + pds +" to " + pdae +"\n" + pcon,Toast.LENGTH_LONG).show(); } }); } public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.smenu, menu); return true; } public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.about: Toast.makeText(Curve.this,"Mobile Advertising Application Using GPS V1.0",Toast.LENGTH_LONG).show(); return true; case R.id.search:{ Intent intent = new Intent(Curve.this, Search.class); intent.putExtra("lon",lon); intent.putExtra("lat",lat); startActivity(intent); //startActivity(new Intent(this, Search.class)); } return true; default: return super.onOptionsItemSelected(item); } } public void SetListViewAdapter(ArrayList<HashMap> daftar) { adapter = new PromotionListAdapter(activity, daftar); list.setAdapter(adapter); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == 100) { Intent intent = getIntent(); finish(); startActivity(intent); } } class Activity extends AsyncTask { @Override protected void onPreExecute() { super.onPreExecute(); pDialog = new ProgressDialog(Curve.this); pDialog.setMessage("Please Wait..."); pDialog.setIndeterminate(false); pDialog.setCancelable(false); pDialog.show(); } protected String doInBackground(String... args) { List params = new ArrayList(); JSONObject json = jParser.makeHttpRequest(url_daftar_promotion, "GET",params); Log.d("All Products: ", json.toString()); try { int success = json.getInt(TAG_SUCCESS); if (success == 1) { daftar_promotion = json.getJSONArray(TAG_DAFTAR_PROMOTION); for (int i = 0; i < daftar_promotion.length();i++){ JSONObject c = daftar_promotion.getJSONObject(i); String PromoID = c.getString(TAG_ID_PROMO); String PromoName = c.getString(TAG_NAMA_PROMO); String pat = "http://10.0.2.2/webserver_maaug/"; String PromoImage = pat + c.getString(TAG_LINK_IMAGE_PROMO); String PromoDesc = c.getString(TAG_DESC_PROMO); String PromoCate = c.getString(TAG_CATE_PROMO); String PromoDateStart = c.getString(TAG_DATES_PROMO); String PromoDateEnd = c.getString(TAG_DATEE_PROMO); String PromoContact = c.getString(TAG_CONT_PROMO); HashMap map = new HashMap(); map.put(TAG_ID_PROMO, PromoID); map.put(TAG_NAMA_PROMO, PromoName); map.put(TAG_LINK_IMAGE_PROMO, PromoImage); map.put(TAG_DESC_PROMO, PromoDesc); map.put(TAG_CATE_PROMO, PromoCate); map.put(TAG_DATES_PROMO, PromoDateStart); map.put(TAG_DATEE_PROMO, PromoDateEnd); map.put(TAG_CONT_PROMO, PromoContact); DaftarPromotion.add(map); } } else { } } catch (JSONException e) { e.printStackTrace(); } return null; } protected void onPostExecute(String file_url) { pDialog.dismiss(); runOnUiThread(new Runnable() { public void run() { SetListViewAdapter(DaftarPromotion); } }); } } } 

y este es mi adaptador personalizado, es muy simple, sin una clase de objeto propia

 package lbs.promotion; import java.util.ArrayList; import java.util.HashMap; import com.javacodegeeks.android.lbs.Curve; import com.javacodegeeks.android.lbs.R; import android.app.Activity; 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.ImageView; import android.widget.TextView; public class PromotionListAdapter extends BaseAdapter { private Activity activity; private ArrayList<HashMap> data; private static LayoutInflater inflater = null; public ImageLoader imageLoader; public PromotionListAdapter(Activity a, ArrayList<HashMap> d) { activity = a; data = d; inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); imageLoader = new ImageLoader(activity.getApplicationContext()); } public int getCount() { return data.size(); } public Object getItem(int position) { return position; } public long getItemId(int position) { return position; } public View getView(int position, View convertView, ViewGroup parent) { View vi = convertView; if (convertView == null)vi = inflater.inflate(R.layout.item_list_promotion, null); TextView PromoID = (TextView) vi.findViewById(R.id.PromoID); TextView PromoName = (TextView) vi.findViewById(R.id.PromoName); TextView PromoImage = (TextView) vi.findViewById(R.id.PromoImage); TextView PromoDesc = (TextView) vi.findViewById(R.id.PromoDesc); TextView PromoCate = (TextView) vi.findViewById(R.id.PromoCate); TextView PromoContact = (TextView) vi.findViewById(R.id.PromoContact); TextView PromoDateStart = (TextView) vi.findViewById(R.id.PromoDateStart); TextView PromoDateEnd = (TextView) vi.findViewById(R.id.PromoDateEnd); ImageView thumb_image = (ImageView) vi.findViewById(R.id.image_promo); HashMap daftar_promotion = new HashMap(); daftar_promotion = data.get(position); PromoID.setText(daftar_promotion.get(Curve.TAG_ID_PROMO)); PromoName.setText(daftar_promotion.get(Curve.TAG_NAMA_PROMO)); PromoImage.setText(daftar_promotion.get(Curve.TAG_LINK_IMAGE_PROMO)); PromoDesc.setText(daftar_promotion.get(Curve.TAG_DESC_PROMO)); PromoCate.setText(daftar_promotion.get(Curve.TAG_CATE_PROMO)); PromoContact.setText(daftar_promotion.get(Curve.TAG_CONT_PROMO)); PromoDateStart.setText(daftar_promotion.get(Curve.TAG_DATES_PROMO)); PromoDateEnd.setText(daftar_promotion.get(Curve.TAG_DATEE_PROMO)); imageLoader.DisplayImage(daftar_promotion.get(Curve.TAG_LINK_IMAGE_PROMO),thumb_image); return vi; } } 

aquí está mi layout.xml

       

¿cómo funciona la función getfilter ()? o hay alguna forma más simple de implementar el filtrado en mi lista de lista? Quiero filtrar en base a mi PromoName

Un filtro tiene dos componentes principales, el performFiltering(CharSequence) y el método publishResults(CharSequence, FilterResults) . En su PromotionListAdapter, deberá implementar la interfaz Filterable y luego Anular el método getFilter () para devolver un nuevo Filtro que tenga implementados estos métodos.

El performFiltering(CharSequence) es donde realizarás la mayor parte de tu trabajo. El argumento CharSequence es la información sobre la que está filtrando. Aquí, primero querrá determinar si la lista debe incluso ser filtrada como el caso base. Una vez que haya decidido realizar el filtrado, cree una nueva ArrayList para su conjunto de datos filtrado (en su caso, una nueva ArrayList>) y recorra su conjunto completo de elementos de la lista, agregando los valores que coinciden con el filtro a su nueva ArrayList .

El tipo de devolución para el método performFiltering es FilterResults. FilterResults es un objeto simple con dos variables, int count y Object results . Una vez que performFiltering haya creado la nueva ArrayList con los datos filtrados, cree una nueva FilterResults, establezca su nueva ArrayList como resultados y el tamaño de esa ArrayList como recuento.

El publishResults(CharSequence, FilterResults) se performFiltering() luego de que performFiltering() retorna. El parámetro CharSequence es el mismo String sobre el que estaba filtrando. El parámetro FilterResults es el retorno de performFiltering() . En este método, querrá configurar su ArrayList nueva como fuente de datos para su Lista y luego invocar notifyDataSetChanged() para actualizar la UI.

Para implementar esto, tuve éxito cuando mi Adaptador realiza un seguimiento de la ArrayList de datos original y una ArrayList filtrada de lo que se muestra actualmente. Aquí hay un código repetitivo basado en su adaptador que puede ayudarlo a comenzar. Ya he comentado líneas importantes.

 public class PromotionListAdapter extends BaseAdapter implements Filterable { private Activity activity; private static LayoutInflater inflater = null; public ImageLoader imageLoader; //Two data sources, the original data and filtered data private ArrayList> originalData; private ArrayList> filteredData; public PromotionListAdapter(Activity a, ArrayList> d) { activity = a; inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); imageLoader = new ImageLoader(activity.getApplicationContext()); //To start, set both data sources to the incoming data originalData = d; filteredData = d; } //For this helper method, return based on filteredData public int getCount() { return filteredData.size(); } //This should return a data object, not an int public Object getItem(int position) { return filteredData.get(position); } public long getItemId(int position) { return position; } //The only change here is that we'll use filteredData.get(position) //Even better would be to use getItem(position), which uses the helper method (see the getItem() method above) public View getView(int position, View convertView, ViewGroup parent) { View vi = convertView; if (convertView == null)vi = inflater.inflate(R.layout.item_list_promotion, null); TextView PromoID = (TextView) vi.findViewById(R.id.PromoID); TextView PromoName = (TextView) vi.findViewById(R.id.PromoName); TextView PromoImage = (TextView) vi.findViewById(R.id.PromoImage); TextView PromoDesc = (TextView) vi.findViewById(R.id.PromoDesc); TextView PromoCate = (TextView) vi.findViewById(R.id.PromoCate); TextView PromoContact = (TextView) vi.findViewById(R.id.PromoContact); TextView PromoDateStart = (TextView) vi.findViewById(R.id.PromoDateStart); TextView PromoDateEnd = (TextView) vi.findViewById(R.id.PromoDateEnd); ImageView thumb_image = (ImageView) vi.findViewById(R.id.image_promo); HashMap daftar_promotion = new HashMap(); //Get data from filtered Data //This line can be replaced with: // daftar_promotion = getItem(position); daftar_promotion = filteredData.get(position); PromoID.setText(daftar_promotion.get(Curve.TAG_ID_PROMO)); PromoName.setText(daftar_promotion.get(Curve.TAG_NAMA_PROMO)); PromoImage.setText(daftar_promotion.get(Curve.TAG_LINK_IMAGE_PROMO)); PromoDesc.setText(daftar_promotion.get(Curve.TAG_DESC_PROMO)); PromoCate.setText(daftar_promotion.get(Curve.TAG_CATE_PROMO)); PromoContact.setText(daftar_promotion.get(Curve.TAG_CONT_PROMO)); PromoDateStart.setText(daftar_promotion.get(Curve.TAG_DATES_PROMO)); PromoDateEnd.setText(daftar_promotion.get(Curve.TAG_DATEE_PROMO)); imageLoader.DisplayImage(daftar_promotion.get(Curve.TAG_LINK_IMAGE_PROMO),thumb_image); return vi; } @Override public Filter getFilter() { return new Filter() { @Override protected FilterResults performFiltering(CharSequence charSequence) { FilterResults results = new FilterResults(); //If there's nothing to filter on, return the original data for your list if(charSequence == null || charSequence.length() == 0) { results.values = originalData; results.count = originalData.size(); } else { ArrayList> filterResultsData = new ArrayList>(); for(HashMap data : originalData) { //In this loop, you'll filter through originalData and compare each item to charSequence. //If you find a match, add it to your new ArrayList //I'm not sure how you're going to do comparison, so you'll need to fill out this conditional if(data matches your filter criteria) { filterResultsData.add(data); } } results.values = filterResultsData; results.count = filteredResultsData.size(); } return results; } @Override protected void publishResults(CharSequence charSequence, FilterResults filterResults) { filteredData = (ArrayList>)filterResults.values; notifyDataSetChanged(); } }; } } 

¡Y ahí lo tienes! Por lo que puedo decir, ya has implementado TextWatcher para que tu inputText EditText esté configurado correctamente, por lo que agregar el método getFilter() y realizar algunos otros cambios menores a tu Adapter debería llevarte a una solución. Creo que también puede crear una variable miembro en su Adaptador para su Filtro, por lo que no está creando una nueva instancia de la clase cada vez que se invoca getFilter (), pero copié / pegué esto de un proyecto mío anterior y estoy Seguro que funciona de esta manera. ¡Juega con él y mira lo que funciona para ti! ¡Espero que esto ayude! Y por favor haz un comentario si necesitas algo aclarado.

tu adaptador necesita implementar Filterable.

para obtener más información sobre esto (y sobre listView), mira el video ” the world of listView ”

aquí hay un código de muestra:

http://codetheory.in/android-filters/