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

本文介绍如何在Android应用中使用TextWatcher接口实现在EditText输入时实时过滤ListView中的数据,提升用户体验。通过正则表达式匹配输入字符串与列表项,实现精确筛选。示例代码包括初始化数据、创建适配器及监听文本变化过程。


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

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

首先贴出实现的效果图


下面贴出主要实现代码

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

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

	

}

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、付费专栏及课程。

余额充值