如何在Android的自定义列表视图中使用searchfunction

我创build了一个包含多个行的列表视图。 我还在上面创build了一个search框。 我想根据列表的特定字段来实现searchfunction。 我怎样才能做到这一点? 任何帮助将不胜感激。

你必须使用model,listview和customadapter进行筛选。 我为此创build了一个演示,假设您有一个名为Product的模型,并且您将在自定义列表视图中显示其内容,其中名称,价格显示在textview中。我的意思是在具有两个textviews的自定义行中,并且要过滤该列表由自定义行的字段之一。在这里我已经过滤“名称”

截图:

初始

初始

过滤

过滤

源代码

//这是你的模型

public class Product { public String name; public Integer price; public Product(String name, Integer price) { super(); this.name = name; this.price = price; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getPrice() { return price; } public void setPrice(Integer price) { this.price = price; } } 

/ /这是你的自定义适配器和列表视图的活动

 public class MainActivity extends Activity{ private LinearLayout llContainer; private EditText etSearch; private ListView lvProducts; private ArrayList<Product> mProductArrayList = new ArrayList<Product>(); private MyAdapter adapter1; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initialize(); // Add Text Change Listener to EditText etSearch.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { // Call back the Adapter with current character to Filter adapter1.getFilter().filter(s.toString()); } @Override public void beforeTextChanged(CharSequence s, int start, int count,int after) { } @Override public void afterTextChanged(Editable s) { } }); } private void initialize() { etSearch = (EditText) findViewById(R.id.etSearch); lvProducts = (ListView)findViewById(R.id.lvOS); } @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); mProductArrayList.add(new Product("a", 100)); mProductArrayList.add(new Product("b", 200)); mProductArrayList.add(new Product("c", 300)); mProductArrayList.add(new Product("d", 400)); mProductArrayList.add(new Product("e", 500)); mProductArrayList.add(new Product("f", 600)); mProductArrayList.add(new Product("g", 700)); mProductArrayList.add(new Product("h", 800)); mProductArrayList.add(new Product("i", 900)); mProductArrayList.add(new Product("j", 1000)); mProductArrayList.add(new Product("k", 1100)); mProductArrayList.add(new Product("l", 1200)); mProductArrayList.add(new Product("m", 1000)); mProductArrayList.add(new Product("n", 1300)); mProductArrayList.add(new Product("o", 1400)); mProductArrayList.add(new Product("p", 1500)); adapter1 = new MyAdapter(MainActivity.this, mProductArrayList); lvProducts.setAdapter(adapter1); } // Adapter Class public class MyAdapter extends BaseAdapter implements Filterable { private ArrayList<Product> mOriginalValues; // Original Values private ArrayList<Product> mDisplayedValues; // Values to be displayed LayoutInflater inflater; public MyAdapter(Context context, ArrayList<Product> mProductArrayList) { this.mOriginalValues = mProductArrayList; this.mDisplayedValues = mProductArrayList; inflater = LayoutInflater.from(context); } @Override public int getCount() { return mDisplayedValues.size(); } @Override public Object getItem(int position) { return position; } @Override public long getItemId(int position) { return position; } private class ViewHolder { LinearLayout llContainer; TextView tvName,tvPrice; } @Override public View getView(final int position, View convertView, ViewGroup parent) { ViewHolder holder = null; if (convertView == null) { holder = new ViewHolder(); convertView = inflater.inflate(R.layout.row, null); holder.llContainer = (LinearLayout)convertView.findViewById(R.id.llContainer); holder.tvName = (TextView) convertView.findViewById(R.id.tvName); holder.tvPrice = (TextView) convertView.findViewById(R.id.tvPrice); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.tvName.setText(mDisplayedValues.get(position).name); holder.tvPrice.setText(mDisplayedValues.get(position).price+""); holder.llContainer.setOnClickListener(new OnClickListener() { public void onClick(View v) { Toast.makeText(MainActivity.this, mDisplayedValues.get(position).name, Toast.LENGTH_SHORT).show(); } }); return convertView; } @Override public Filter getFilter() { Filter filter = new Filter() { @SuppressWarnings("unchecked") @Override protected void publishResults(CharSequence constraint,FilterResults results) { mDisplayedValues = (ArrayList<Product>) results.values; // has the filtered values notifyDataSetChanged(); // notifies the data with new filtered values } @Override protected FilterResults performFiltering(CharSequence constraint) { FilterResults results = new FilterResults(); // Holds the results of a filtering operation in values ArrayList<Product> FilteredArrList = new ArrayList<Product>(); if (mOriginalValues == null) { mOriginalValues = new ArrayList<Product>(mDisplayedValues); // saves the original data in mOriginalValues } /******** * * If constraint(CharSequence that is received) is null returns the mOriginalValues(Original) values * else does the Filtering and returns FilteredArrList(Filtered) * ********/ if (constraint == null || constraint.length() == 0) { // set the Original result to return results.count = mOriginalValues.size(); results.values = mOriginalValues; } else { constraint = constraint.toString().toLowerCase(); for (int i = 0; i < mOriginalValues.size(); i++) { String data = mOriginalValues.get(i).name; if (data.toLowerCase().startsWith(constraint.toString())) { FilteredArrList.add(new Product(mOriginalValues.get(i).name,mOriginalValues.get(i).price)); } } // set the Filtered result to return results.count = FilteredArrList.size(); results.values = FilteredArrList; } return results; } }; return filter; } } } 

//这是你的activity_main.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="fill_parent" android:orientation="vertical" > <EditText android:id="@+id/etSearch" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <ListView android:id="@+id/lvProducts" android:layout_width="fill_parent" android:layout_height="wrap_content" ></ListView> </LinearLayout> 

//这是你的row.xml

  <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/llContainer" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" > <TextView android:id="@+id/tvName" android:layout_width="0dp" android:layout_height="wrap_content" android:singleLine="true" android:layout_weight="1" /> <TextView android:id="@+id/tvPrice" android:layout_width="0dp" android:layout_height="wrap_content" android:singleLine="true" android:layout_weight="1" /> </LinearLayout> 

为此,您首先需要添加一个edittext,您将在其中键入以从列表中过滤数据,

然后在列表中启用筛选,

 editText = (EditText) findViewById(R.id.searchList); adapter = new CustomListViewAdapter(this, R.layout.list_row, rowItems); listView.setAdapter(adapter); listView.setTextFilterEnabled(true); 

然后你需要为edittext添加TextChangeListener()

 editText.addTextChangedListener(new TextWatcher() { public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { } public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { } public void afterTextChanged(Editable arg0) { MyActivityName.this.adapter.getFilter().filter(arg0); } }); 

使用下面的方法。

 your edit text box.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void afterTextChanged(Editable theWatchedText) { } }); } 

您可以为您的search框设置一个TextWatcher,并更改您的TextWatcher onTextChanged()上的光标像代码如下:

 TextWatcher filterNameTextWatcher = new TextWatcher() public void beforeTextChanged(CharSequence s, int start, int count,int after) { } public void onTextChanged(CharSequence s,int start, int before,int count) { Cursor FilteredNameList = ZoneCardDBAdapter.instance.CursorFilteredName(s.toString()); Listadapter.changeCursor(FilteredNameList); } @Override public void afterTextChanged(Editable arg0) { } }; EditText filterTextName = (EditText)this.findViewById(R.id.edtZoneCardNameFilter); filterTextCPName.addTextChangedListener(filterNameTextWatcher);