Android实现ListView过滤功能,继承于BaseAdapter,非ArrayAdapter。

其实实现ListView过滤功能最方便的便是使用ArrayAdapter,里面自带的getFilter()方法能很方便的实现此功能,但是在实际的开发中,一般都是继承于BaseAdapter。还有一种是利用控件AutoComplete,这种方式只是在输入框的下方重新显示一个列表,显然,很多时候这两种方式也满足不了我们的要求。

在Activity中定义一个类,让它实现TextWatcher接口,然后再onTextChanged方法中去过滤。然后常见相应的Pattern和match,来判断传入的参数时候符合列表中的数据,符合就加入一个新的列表中。

首先贴出实现的效果图

下面贴出主要实现代码

双击代码全选
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package com.example.demo;
     
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import android.os.Bundle;
import android.app.Activity;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.Menu;
import android.widget.EditText;
import android.widget.ListView;
     
public class MainActivity extends Activity {
         
     List<People> people = new ArrayList<People>() ;
     EditText editinput;
     ListView listview;
     Adapter adapter;
         
     
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
         editinput = (EditText)findViewById(R.id.edit);
         listview = (ListView)findViewById(R.id.ydlist);
         initdata();
         adapter = new Adapter(getApplicationContext(), people);
         listview.setAdapter(adapter);
         editinput.addTextChangedListener( new watcher());
     }
         
      void initdata(){
             
         people.add( new People( "张三" , "1374456" ));
         people.add( new People( "张三小子" , "12444455" ));
         people.add( new People( "李一" , "1345555" ));
         people.add( new People( "王一" , "1355555" ));
         people.add( new People( "王二" , "1365555" ));
         people.add( new People( "李三" , "13565555" ));
         people.add( new People( "李一" , "123555" ));
      }
         
     class watcher implements TextWatcher{
     
         @Override
         public void afterTextChanged(Editable s) {
             // TODO Auto-generated method stub
                 
         }
     
         @Override
         public void beforeTextChanged(CharSequence s, int start, int count,
                 int after) {
             // TODO Auto-generated method stub   
                 
         }
     
         @Override
         public void onTextChanged(CharSequence s, int start, int before,
                 int count) {
             // TODO Auto-generated method stub
             String aa = s.toString();
             Pattern p = Pattern.compile(aa);
             List<People> we = new ArrayList<People>();       
             for ( int i=0;i<people.size();i++){
                 People pp = people. get (i);
             Matcher matcher = p.matcher(pp.getName()+pp.getPhome());
             if (matcher.find()){
                 we.add(pp);
             }
             }
             adapter = new Adapter(getApplicationContext(), we);
             listview.setAdapter(adapter);
         }
             
     }
         
     @Override
     public boolean onCreateOptionsMenu(Menu menu) {
         // Inflate the menu; this adds items to the action bar if it is present.
         getMenuInflater().inflate(R.menu.activity_main, menu);
         return true ;
     }
     
}

自定义Adapter

双击代码全选
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
package com.example.demo;
     
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
     
public class Adapter extends BaseAdapter  {
     private List<People> people = new ArrayList<People>();
     Context ct;
     private LayoutInflater inflater;
     public Adapter(Context ct,List<People> people) {
         // TODO Auto-generated constructor stub
         this .people = people;
         this .ct = ct;
         inflater = (LayoutInflater) ct.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
     }
     
     @Override
     public int getCount() {
         // TODO Auto-generated method stub
         return people.size();
     }
     
     @Override
     public Object getItem( int position) {
         // TODO Auto-generated method stub
         return people.get(position);
     }
     
     @Override
     public long getItemId( int position) {
         // TODO Auto-generated method stub
         return position;
     }
     
     @Override
     public View getView( int position, View convertView, ViewGroup parent) {
         // TODO Auto-generated method stub
         People p = people.get(position);
         if (convertView== null ){
             convertView = inflater.inflate(R.layout.yd_item, null );
         }
         TextView tv1=(TextView)convertView.findViewById(R.id.ydtext1);
         TextView tv2=(TextView)convertView.findViewById(R.id.ydtext2);
         tv1.setText(p.getName());
         tv2.setText(p.getPhome());
         return convertView;
     }
     
         
     
}

实体类

双击代码全选
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package com.example.demo;
     
public class People {
     private String Name ;
     private String Phome;
         
         
         
     public String getName() {
         return Name;
     }
     
     
     
     public void setName(String name) {
         Name = name;
     }
     
     
     
     public String getPhome() {
         return Phome;
     }
     
     
     
     public void setPhome(String phome) {
         Phome = phome;
     }
     
     
     
     public People(String name,String phone){
         super();
         this .Name = name;
         this .Phome = phone;   
     }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值