项目作者: liwenzhi

项目描述 :
使用EditText结合过滤器实现数据过滤的一个简单示例。
高级语言: Java
项目地址: git://github.com/liwenzhi/FilterDemo.git
创建时间: 2017-05-30T11:06:14Z
项目社区:https://github.com/liwenzhi/FilterDemo

开源协议:

下载


EditText结合Fileter过滤器效果的设计

之前看到一个SerchView的搜索框,发现里面使用到了Filter,可以很方便的实现输入框中数据的过滤和判断,这里介绍下给大家。
过滤效果:

1

程序实现的功能是:用户输入用户名或家乡里面包含的任何字符,都会产生符合条件的ListView列表。

程序的实现:

1.主页面的布局

一个EditText和ListView

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. >
  7. <EditText
  8. android:id="@+id/et_input"
  9. android:layout_width="fill_parent"
  10. android:layout_height="wrap_content"
  11. android:singleLine="true"
  12. android:drawableLeft="@drawable/search"
  13. android:hint="请输入你要搜索的姓名"
  14. ></EditText>
  15. <ListView
  16. android:layout_width="match_parent"
  17. android:layout_height="match_parent"
  18. android:id="@+id/lv_show"
  19. ></ListView>
  20. </LinearLayout>

2.ListView的条目布局也是比较简单的,两个TextView

3.适配器的类结合Filter使用,需要重点理解的地方

  1. package com.example.FilterDemo;
  2. import android.content.Context;
  3. import android.view.LayoutInflater;
  4. import android.view.View;
  5. import android.view.ViewGroup;
  6. import android.widget.*;
  7. import java.util.ArrayList;
  8. import java.util.List;
  9. /**
  10. * 在适配器中使用过滤效果
  11. */
  12. public class ListAdapter extends BaseAdapter implements Filterable {
  13. private List<Person> list;
  14. private List<Person> newList;//刷选后得到的ListView
  15. private Context context;
  16. private PersonFilter filter;
  17. public ListAdapter(Context context, List<Person> list) {
  18. this.list = list;
  19. this.context = context;
  20. }
  21. @Override
  22. public int getCount() {
  23. return list.size();
  24. }
  25. @Override
  26. public Object getItem(int position) {
  27. return list.get(position);
  28. }
  29. @Override
  30. public long getItemId(int position) {
  31. return position;
  32. }
  33. @Override
  34. public View getView(int position, View convertView, ViewGroup parent) {
  35. if (convertView == null) {
  36. convertView = LayoutInflater.from(context).inflate(R.layout.item_list, null);
  37. }
  38. Person p = list.get(position);
  39. TextView tv_name = (TextView) convertView.findViewById(R.id.tv_name);
  40. TextView tv_home = (TextView) convertView.findViewById(R.id.tv_home);
  41. tv_name.setText(p.name);
  42. tv_home.setText(p.home);
  43. return convertView;
  44. }
  45. @Override
  46. public Filter getFilter() {
  47. if (filter == null) {
  48. filter = new PersonFilter(list);
  49. }
  50. return filter;
  51. }
  52. /**
  53. * 重要的过滤器的类
  54. */
  55. public class PersonFilter extends Filter {
  56. private List<Person> original;
  57. public PersonFilter(List<Person> list) {
  58. this.original = list;
  59. }
  60. @Override
  61. protected FilterResults performFiltering(CharSequence constraint) {
  62. FilterResults results = new FilterResults();
  63. if (constraint == null || constraint.length() == 0) { //如果是没输入的情况下,可显示全部,也可以不显示任何数据
  64. // results.values = original;
  65. // results.count = original.size();
  66. results.values = new ArrayList<Person>();
  67. results.count = 0;
  68. } else {
  69. List<Person> mList = new ArrayList<Person>();
  70. for (Person p : original) {
  71. //判断符合情况的数据,可以选择多个条件哦
  72. //1.第一个字符相同
  73. //2.输入的字符被包含在数据里面的
  74. if (p.name.toUpperCase().startsWith(constraint.toString().toUpperCase())
  75. || p.home.toUpperCase().startsWith(constraint.toString().toUpperCase())
  76. || p.name.contains(constraint.toString())
  77. || p.home.contains(constraint.toString())
  78. ) {
  79. mList.add(p);
  80. }
  81. }
  82. results.values = mList;
  83. newList = mList;//
  84. results.count = mList.size();
  85. }
  86. return results;
  87. }
  88. @Override
  89. protected void publishResults(CharSequence constraint,
  90. FilterResults results) {
  91. list = (List<Person>) results.values;
  92. notifyDataSetChanged();
  93. }
  94. }
  95. /**
  96. * 暴露出新的刷选出来的ListView
  97. */
  98. public List<Person> getNewList() {
  99. return newList;
  100. }
  101. }

4.主方法的类的设计

  1. package com.example.FilterDemo;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. import android.text.Editable;
  5. import android.text.TextUtils;
  6. import android.text.TextWatcher;
  7. import android.view.View;
  8. import android.widget.AdapterView;
  9. import android.widget.EditText;
  10. import android.widget.ListView;
  11. import android.widget.Toast;
  12. import java.util.ArrayList;
  13. import java.util.List;
  14. /**
  15. * Filter的使用
  16. */
  17. public class MyActivity extends Activity implements AdapterView.OnItemClickListener {
  18. EditText et_input;
  19. ListView lv_show;
  20. ListAdapter listAdapter;
  21. List<Person> personList = new ArrayList<Person>();
  22. @Override
  23. public void onCreate(Bundle savedInstanceState) {
  24. super.onCreate(savedInstanceState);
  25. setContentView(R.layout.main);
  26. initView();
  27. initData();
  28. initEvent();
  29. }
  30. private void initView() {
  31. et_input = (EditText) findViewById(R.id.et_input);
  32. lv_show = (ListView) findViewById(R.id.lv_show);
  33. }
  34. private void initData() {
  35. listAdapter = new ListAdapter(this, personList);
  36. lv_show.setAdapter(listAdapter);
  37. personList.add(new Person("李小明", "江西南昌"));
  38. personList.add(new Person("李小明1", "江西南昌"));
  39. personList.add(new Person("李小明2", "江西南昌"));
  40. personList.add(new Person("李小明3", "江西南昌"));
  41. personList.add(new Person("牛福航1", "山东菏泽"));
  42. personList.add(new Person("牛福航2", "山东菏泽"));
  43. personList.add(new Person("牛福航3", "山东菏泽"));
  44. personList.add(new Person("牛福航4", "山东菏泽"));
  45. personList.add(new Person("李文", "广西岑溪"));
  46. }
  47. private void initEvent() {
  48. et_input.addTextChangedListener(filterTextWatcher); //让输入框监听
  49. lv_show.setOnItemClickListener(this);
  50. }
  51. /**
  52. * Editext监听对象
  53. */
  54. private TextWatcher filterTextWatcher = new TextWatcher() {
  55. @Override
  56. public void afterTextChanged(Editable s) {
  57. }
  58. @Override
  59. public void beforeTextChanged(CharSequence s, int start, int count,
  60. int after) {
  61. }
  62. @Override
  63. public void onTextChanged(CharSequence s, int start, int before,
  64. int count) {
  65. listAdapter.getFilter().filter(s); //这里传入数据給过滤器处理
  66. }
  67. };
  68. /**
  69. * 点击了ListView 的条目的回调监听
  70. */
  71. @Override
  72. public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
  73. String msg = et_input.getText().toString();
  74. if (TextUtils.isEmpty(msg)) {
  75. Toast.makeText(this, "选中了:" + personList.get(i), Toast.LENGTH_SHORT).show();
  76. } else {
  77. Toast.makeText(this, "选中了:" + listAdapter.getNewList().get(i), Toast.LENGTH_SHORT).show();
  78. }
  79. }
  80. }

其实程序中过滤器Filter的具体实现是在适配器Adapter中的,然后在外面通过Filter.filter(s);传入需要过滤的数据,从而得出刷选后所求的数据。

网上也有很多封装得比较多的searchView,也是使用Filter来实现数据过滤的。

2

共勉:念念不忘必有回响。