如何使用扩展baseadapter的自定义适配器来实现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> 

我如何getfilter()函数工作? 或者有没有更简单的方法来实现我的列表视图中的过滤? 我想根据我的PromoName进行过滤

filter有两个主要组件: performFiltering(CharSequence)方法和publishResults(CharSequence, FilterResults)方法。 在您的PromotionListAdapter中,您需要实现Filterable接口,然后重写getFilter()方法以返回实现了这些方法的新Filter。

performFiltering(CharSequence)方法是您完成大部分工作的地方。 CharSequence参数是您要过滤的数据。 在这里,你首先要确定列表是否应该被过滤为基本情况。 一旦你决定执行过滤,为你的过滤数据集创build一个新的ArrayList(在你的情况下,一个新的ArrayList>),并循环你的完整的列表项,添加匹配filter的值到你的新ArrayList 。

执行performFiltering方法的返回types是FilterResults。 FilterResults是一个包含两个variablesint countObject results的简单对象。 一旦performFiltering创build了带有过滤数据的新ArrayList,创build一个新的FilterResults,将新的ArrayList设置为结果,并将该ArrayList的大小设置为count。

performFiltering()返回后调用publishResults(CharSequence, FilterResults)方法。 CharSequence参数与您过滤的string相同。 FilterResults参数是performFiltering()的返回值。 在这种方法中,您需要将新的ArrayList设置为List的数据源,然后调用notifyDataSetChanged()来更新UI。

为了实现这一点,我已经成功了,当我的适配器跟踪数据的原始数组列表和正在显示的过滤数组列表。 这里有一些基于你的适配器的样板代码,可以帮助你开始。 我已经评论过重要的行。

 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(); } }; } } 

在那里,你有它! 据我所知,你已经为你的inputText EditText实现了TextWatcher的设置,所以添加getFilter()方法并对你的Adapter做一些小的改动应该会导致你的解决scheme。 我相信你也可以在你的Filter的Adapter上创build一个成员variables,所以每次调用getFilter()时都不会创build这个类的新实例,但是我从之前的项目中复制/粘贴了这个variables,确定它是这样工作的。 玩它,看看什么适合你! 希望这可以帮助! 如果您需要澄清任何事情,请做评论。

你的适配器需要实现Filterable。

关于这个(和关于listView)的更多信息,看video“ listView的世界 ”

这里是一个示例代码:

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