Android 自訂過濾搜尋方塊 filterable

來源:互聯網
上載者:User

標籤:

簡單的說就是ListView上面有一個SearchBox,然後searchbox裡輸入內容後對下面listview進行過濾。

涉及的控制項:ListView必須有,EditText用來自訂SearchBox

大概就是這樣:

 

 

 

 

先看這個有圖片的EditText,實現方法有兩個,一是用相對布局RelativeLayout + ImageView + EditText。

二是直接用EditText的一個屬性DrawableLeft,簡單的UI這個就可以實現了

所以這個Activity的布局就很簡單,可以用ListActivity實現:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    tools:context=".MainActivity" >    <EditText        android:id="@+id/searchbox"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignParentTop="true"        android:drawableLeft="@drawable/searchbox"        android:hint="Search"        android:drawablePadding="5dp"        android:singleLine="true"        android:ems="10" >        <requestFocus />    </EditText>        <ListView         android:id="@android:id/list"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_below="@id/searchbox">    </ListView> </RelativeLayout>

 

再說過濾功能:這個感覺不想搜尋,就像是簡單的過濾,如果涉及到去資料庫取資料那個才是搜尋了

用到了Filterable介面,Filter類

要讓資料有過濾功能,我們需要在繼承的BaseAdapter的基礎上再實現Filterable介面的getFilter方法,同時在Adapter內部寫一個繼承Filter的內部類來完成過濾功能:

private class ListAdapter extends BaseAdapter implements Filterable {private List<Person> list;private Context context;private PersonFilter filter;public ListAdapter(List<Person> list, Context context) {this.list = list;this.context = context;}@Overridepublic int getCount() {return list.size();}@Overridepublic Object getItem(int position) {return list.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {if (convertView == null) {convertView = LayoutInflater.from(context).inflate(R.layout.list_item, null);}Person p = list.get(position);TextView firstname = (TextView)convertView.findViewById(R.id.firstname);TextView lastname = (TextView)convertView.findViewById(R.id.lastname);TextView age = (TextView)convertView.findViewById(R.id.age);firstname.setText(p.firstname);lastname.setText(p.lastname);age.setText(p.age + "");return convertView;}@Overridepublic Filter getFilter() {if (filter == null) {filter = new PersonFilter(list);}return filter;}private class PersonFilter extends Filter {private List<Person> original;public PersonFilter(List<Person> list) {this.original = list;}@Overrideprotected FilterResults performFiltering(CharSequence constraint) {FilterResults results = new FilterResults();if (constraint == null || constraint.length() == 0) {results.values = original;results.count = original.size();} else {List<Person> mList = new ArrayList<Person>();for (Person p: original) {if (p.firstname.toUpperCase().startsWith(constraint.toString().toUpperCase())|| p.lastname.toUpperCase().startsWith(constraint.toString().toUpperCase())|| new String(p.age + "").toUpperCase().startsWith(constraint.toString().toUpperCase())) {mList.add(p);}}results.values = mList;results.count = mList.size();}return results;}@Overrideprotected void publishResults(CharSequence constraint,FilterResults results) {list = (List<Person>)results.values;notifyDataSetChanged();}}}

 Filter類中的兩個方法看名字就是知道一個是執行過濾的,一個重新整理listview資料展現結果的。其中我採用了首碼匹配,就是用輸入的字串和ListView裡的所有Person的各個屬性的首碼做比較。也可以用更加複雜的匹配,例如Regex。

關鍵在於EditText裡的資料是如何傳入的,要寫一個TextWater,並且要讓EditText註冊一下這個監聽器:

        private TextWatcher filterTextWatcher = new TextWatcher() {@Overridepublic void afterTextChanged(Editable s) {}@Overridepublic void beforeTextChanged(CharSequence s, int start, int count,int after) {}@Overridepublic void onTextChanged(CharSequence s, int start, int before,int count) {listAdapter.getFilter().filter(s); //這裡傳入資料就可以了}};

 以上關鍵代碼。非關鍵代碼是Person類以及List_Item的布局:

        private class Person {public String firstname;public String lastname;public int age;public Person(String firtname, String lastname, int age) {this.firstname = firtname;this.lastname = lastname;this.age = age;}}

 List_Item布局:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="horizontal" >    <TextView        android:id="@+id/firstname"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_margin="10dp"        android:text="Firstname" />    <TextView        android:id="@+id/lastname"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_margin="10dp"        android:text="Lastname" />        <TextView        android:id="@+id/age"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_margin="10dp"        android:text="Age" /></LinearLayout>

 

/home/wangjianhua/Desktop/1365932013_4825.jpg

Android 自訂過濾搜尋方塊 filterable

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.