Как реализовать getfilter () с пользовательским адаптером, который расширяет базовый адаптер

Вот моя главная деятельность

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<String, String>> DaftarPromotion = new ArrayList<HashMap<String, String>>(); 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<String, String>>(); 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<String, String> 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<String, String>> 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<String, String, String> { @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<NameValuePair> params = new ArrayList<NameValuePair>(); 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<String, String> map = new HashMap<String, String>(); 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); } }); } } } 

И это мой пользовательский адаптер, он очень простой, без класса объекта его собственного

 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<String, String>> data; private static LayoutInflater inflater = null; public ImageLoader imageLoader; public PromotionListAdapter(Activity a, ArrayList<HashMap<String, String>> 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<String, String> daftar_promotion = new HashMap<String, String>(); 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; } } 

Вот мой layout.xml

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" > <!-- Editext for Search --> <EditText android:id="@+id/search_box" android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="type to search" android:inputType="text" android:maxLines="1"/> <ListView android:id="@+id/list" android:layout_width="fill_parent" android:layout_height="wrap_content" android:divider="#040404" android:dividerHeight="1dp" android:listSelector="@drawable/list_selector" /> </LinearLayout> 1 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" > <!-- Editext for Search --> <EditText android:id="@+id/search_box" android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="type to search" android:inputType="text" android:maxLines="1"/> <ListView android:id="@+id/list" android:layout_width="fill_parent" android:layout_height="wrap_content" android:divider="#040404" android:dividerHeight="1dp" android:listSelector="@drawable/list_selector" /> </LinearLayout> 

Как я могу получить функцию getfilter ()? Или есть ли более простой способ реализовать фильтрацию в моем списке? Я хочу фильтровать на основе моего PromoName

Фильтр имеет два основных компонента: метод performFiltering(CharSequence) метод publishResults(CharSequence, FilterResults) . В вашем продвигающемListAdapter вам нужно реализовать интерфейс Filterable, а затем переопределить метод getFilter (), чтобы вернуть новый фильтр, который реализовал эти методы.

Метод performFiltering(CharSequence) – это то, где вы будете выполнять основную часть своей работы. Аргумент CharSequence – это данные, которые вы фильтруете. Здесь вы сначала захотите определить, должен ли этот список даже быть отфильтрован как базовый регистр. После того, как вы решите выполнить фильтрацию, создайте новый ArrayList для вашего фильтрованного набора данных (в вашем случае, новый ArrayList>) и пропустите полный набор элементов списка, добавив значения, соответствующие фильтру, вашему новому ArrayList ,

Тип возвращаемого значения для метода performFiltering – FilterResults. FilterResults – простой объект с двумя переменными, int count и Object results . После того, как performFiltering создал новый ArrayList с отфильтрованными данными, создайте новый FilterResults, установив новый ArrayList в качестве результатов и размер этого ArrayList в качестве count.

Метод publishResults(CharSequence, FilterResults) вызывается после выполнения функции performFiltering() . Параметр CharSequence является той же строкой, в которую вы были отфильтрованы. Параметр FilterResults является возвратом from performFiltering() . В этом методе вы хотите установить новый ArrayList в качестве источника данных для своего списка, а затем вызвать notifyDataSetChanged() для обновления пользовательского интерфейса.

Чтобы реализовать это, у меня был успех, когда мой адаптер отслеживает как исходный ArrayList данных, так и фильтрованный ArrayList того, что в настоящее время отображается. Вот какой шаблонный код на основе вашего адаптера, который поможет вам начать работу. Я прокомментировал выше важные строки.

 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<HashMap<String, String>> originalData; private ArrayList<HashMap<String, String>> filteredData; public PromotionListAdapter(Activity a, ArrayList<HashMap<String, String>> 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<String, String> daftar_promotion = new HashMap<String, String>(); //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<HashMap<String,String>> filterResultsData = new ArrayList<HashMap<String,String>>(); for(HashMap<String,String> 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<HashMap<String,String>>)filterResults.values; notifyDataSetChanged(); } }; } } 

И вот оно! Насколько я могу судить, вы уже внедрили TextWatcher для вашего вводаText EditText, настроенного правильно, поэтому добавление метода getFilter() и внесение нескольких других незначительных изменений в ваш адаптер приведет вас к решению. Я считаю, что вы также можете создать переменную-член в своем адаптере для вашего фильтра, поэтому вы не создаете новый экземпляр класса каждый раз, когда вызывается getFilter (), но я копирую / вставляю его из предыдущего моего проекта и am Уверен, что это работает так. Играйте с ним и посмотрите, что сработает для вас! Надеюсь это поможет! И, пожалуйста, сделайте комментарий, если вам нужно что-нибудь разъясненное.

Вам необходимо адаптировать адаптер.

Для получения дополнительной информации об этом (и о listView), посмотрите видео « мир listView »,

Вот пример кода:

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