edittext + listview 实现搜索listview中的内容方法(推荐)
程序员文章站
2022-06-20 22:50:46
主要原理:是在主界面有两个空间,一个是edittext,一个是listview,listview是放在edittext下面的,然后自定义建立一个adapter适配器,...
主要原理:是在主界面有两个空间,一个是edittext,一个是listview,listview是放在edittext下面的,然后自定义建立一个adapter适配器,
这个适配器要继承filterable这个接口,并实现这个接口的两个方法,一个是过滤方法,一个是过滤后的方法,一般我们是在过滤方法里面实现过滤,
在过滤后的方法里面调用notifydatasetchanged();也就是使适配器更新数据,这里还有用到一个pinyin4j-2.5.0.jar的架包,这个主要是汉字转拼
音的功能
mainactivity.java
public class mainactivity extends activity { private edittext et_filter; private useradapter adapter; private listview lv_list; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); list<userinfo> userinfos = new arraylist<userinfo>(); for (int i = 0; i < 2; i++) { userinfo user = new userinfo(); user.setusername("张三" + i); user.setphonenum("12345" + i); userinfos.add(user); } for (int i = 0; i < 2; i++) { userinfo user = new userinfo(); user.setusername("李四" + i); user.setphonenum("12345" + i); userinfos.add(user); } lv_list = (listview) findviewbyid(r.id.lv_list); adapter = new useradapter(mainactivity.this, userinfos); lv_list.setadapter(adapter); et_filter = (edittext) findviewbyid(r.id.et_filter); et_filter.addtextchangedlistener(new textwatcher() { @override public void ontextchanged(charsequence s, int start, int before, int count) { adapter.getfilter().filter(et_filter.gettext().tostring()); } @override public void beforetextchanged(charsequence s, int start, int count, int after) { } @override public void aftertextchanged(editable s) { } }); } }
useradapter.java
package com.example.edittextfilterdemo; import java.util.arraylist; import java.util.list; import android.content.context; import android.util.log; import android.view.layoutinflater; import android.view.view; import android.view.viewgroup; import android.widget.baseadapter; import android.widget.filter; import android.widget.filterable; import android.widget.textview; /** * 自定义具有过滤功能的adapter类 * */ public class useradapter extends baseadapter implements filterable { private myfilter myfilter; private list<userinfo> userinfos; private context context; private arraylist<userinfo> moriginalvalues; private final object mlock = new object(); public useradapter(context context, list<userinfo> userinfos) { this.context = context; this.userinfos = userinfos; } @override public int getcount() { // todo auto-generated method stub return userinfos.size(); } @override public object getitem(int arg0) { // todo auto-generated method stub return userinfos.get(arg0); } @override public long getitemid(int position) { // todo auto-generated method stub return position; } @override public view getview(int position, view convertview, viewgroup parent) { view view = convertview; viewholder holder; if (view == null) { view = layoutinflater.from(context).inflate(r.layout.list_item, null); holder = new viewholder(); holder.tv_nick = (textview) view.findviewbyid(r.id.tv_nick); holder.tv_mobile = (textview) view.findviewbyid(r.id.tv_mobile); view.settag(holder); } else { holder = (viewholder) view.gettag(); } holder.tv_nick.settext(userinfos.get(position).getusername()); holder.tv_mobile.settext(userinfos.get(position).getphonenum()); return view; } static class viewholder { textview tv_nick; textview tv_mobile; } @override public filter getfilter() { if (myfilter == null) { myfilter = new myfilter(); } return myfilter; } class myfilter extends filter { @override protected filterresults performfiltering(charsequence prefix) { // 持有过滤操作完成之后的数据。该数据包括过滤操作之后的数据的值以及数量。 count:数量 values包含过滤操作之后的数据的值 filterresults results = new filterresults(); if (moriginalvalues == null) { synchronized (mlock) { // 将list的用户 集合转换给这个原始数据的arraylist moriginalvalues = new arraylist<userinfo>(userinfos); } } if (prefix == null || prefix.length() == 0) { synchronized (mlock) { arraylist<userinfo> list = new arraylist<userinfo>( moriginalvalues); results.values = list; results.count = list.size(); } } else { // 做正式的筛选 string prefixstring = prefix.tostring().tolowercase(); // 声明一个临时的集合对象 将原始数据赋给这个临时变量 final arraylist<userinfo> values = moriginalvalues; final int count = values.size(); // 新的集合对象 final arraylist<userinfo> newvalues = new arraylist<userinfo>( count); for (int i = 0; i < count; i++) { // 如果姓名的前缀相符或者电话相符就添加到新的集合 final userinfo value = (userinfo) values.get(i); log.i("coder", "pinyinutils.getalpha(value.getusername())" + pinyinutils.getfirstspell(value.getusername())); if (pinyinutils.getfirstspell(value.getusername()).startswith( prefixstring) || value.getphonenum().startswith(prefixstring)||value.getusername().startswith(prefixstring)) { newvalues.add(value); } } // 然后将这个新的集合数据赋给filterresults对象 results.values = newvalues; results.count = newvalues.size(); } return results; } @override protected void publishresults(charsequence constraint, filterresults results) { // 重新将与适配器相关联的list重赋值一下 userinfos = (list<userinfo>) results.values; if (results.count > 0) { notifydatasetchanged(); } else { notifydatasetinvalidated(); } } } }
activity_main.xml:
<linearlayout 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:orientation="vertical" tools:context="com.example.edittextfilterdemo.mainactivity" > <edittext android:id="@+id/et_filter" android:layout_width="match_parent" android:layout_height="wrap_content" /> <listview android:id="@+id/lv_list" android:layout_width="match_parent" android:layout_height="wrap_content" > </listview> </linearlayout>
以上这篇edittext + listview 实现搜索listview中的内容方法(推荐)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
上一篇: android利用消息机制获取网络图片
推荐阅读
-
Android中判断listview是否滑动到顶部和底部的实现方法
-
ListView实现顶部和底部内容指示器的方法
-
edittext + listview 实现搜索listview中的内容方法(推荐)
-
Android编程实现ListView内容无限循环显示的方法
-
C#实现读取DataSet数据并显示在ListView控件中的方法
-
Android中判断listview是否滑动到顶部和底部的实现方法
-
.NET WinForm实现在listview中添加progressbar的方法
-
.NET WinForm实现在listview中添加progressbar的方法
-
Android开发实现ScrollView中嵌套两个ListView的方法