edittext + listview 实现搜索listview中的内容方法(推荐)

主要原理:是在主界面有两个空间,一个是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中的内容方法(推荐)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Android 根据EditText搜索框ListView动态显示数据

    根据EditText搜索框ListView动态显示数据是根据需求来的,觉得这之中涉及的东西可能比较的有意思,所以动手来写一写,希望对大家有点帮助. 首先,我们来分析下整个过程: 1.建立一个layout,包含一个EditText搜索框和一个ListView 2.创建一个数据集mData,用于ListView的Adapter的创建 3.添加EditText的文本改变的监听器 4.利用notifyDataSetChanged()动态更新ListView 第一步:创建一个搜索框 这个还是比较容易的,这

  • Android ListView用EditText实现搜索功能效果

    前言 最近在开发一个IM项目的时候有一个需求就是,好友搜索功能.即在EditText中输入好友名字,ListView列表中动态展示刷选的好友列表.我把这个功能抽取出来了,先贴一下效果图: 分析 在查阅资料以后,发现其实Android中已经帮我们实现了这个功能,如果你的ListView使用的是系统的ArrayAdapter,那么恭喜你,下面的事情就很简单了,你只需要调用下面的代码就可以实现了: searchEdittext.addTextChangedListener(new TextWatche

  • 小心!Listview结合EditText使用实例中遇到的那些坑

    前几天一同学项目中的某个功能需要ListView+EditText来实现,希望我给他写个Demo,自己就随手写了一个小的Demo.后来想了想觉得这个功能其实挺常用的,而且期间也踩了几个坑,就整理了一下,希望能够帮到大家.好了,废话不多说了,接着就贴代码. 一.编写布局文件 1.activity的布局activity_main <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xml

  • Android编程使用ListView实现数据列表显示的方法

    本文实例讲述了Android编程使用ListView实现数据列表显示的方法.分享给大家供大家参考,具体如下: 要将数据库中的数据列表显示在屏幕上,我们要使用ListView这个控件,当用户从数据库中取出数据时,要将数据绑定到显示控件上,如何绑定呢,我们需要创建适配器进行绑定,创建适配器有两种方式: 第一种是用SimpleAdapter创建(要求绑定的数据是List<HashMap<String, Object>>数据类型) 第二种是用SimpleCursorAdapter创建(要求

  • edittext + listview 实现搜索listview中的内容方法(推荐)

    主要原理:是在主界面有两个空间,一个是EditText,一个是ListView,ListView是放在EditText下面的,然后自定义建立一个adapter适配器, 这个适配器要继承Filterable这个接口,并实现这个接口的两个方法,一个是过滤方法,一个是过滤后的方法,一般我们是在过滤方法里面实现过滤, 在过滤后的方法里面调用notifyDataSetChanged();也就是使适配器更新数据,这里还有用到一个pinyin4j-2.5.0.jar的架包,这个主要是汉字转拼 音的功能 Mai

  • 修改已有docker容器中的内容方法

    一.docker ps    列出容器 二.docker cp   拷贝文件至容器 注:docker中宿主机与容器(container)互相拷贝传递文件的方法 1.从容器拷贝文件到宿主机 docker cp mycontainer:/opt/testnew/file.txt /opt/test/ 2.从宿主机拷贝文件到容器 docker cp /opt/test/file.txt mycontainer:/opt/testnew/ 需要注意的是,不管容器有没有启动,拷贝命令都会生效. 当结束后,

  • Java 获取Html文本中的img标签下src中的内容方法

    如下所示: /** * 得到网页中图片的地址 * @param sets html字符串 */ public Set<String> getImgStr(String htmlStr) { Set<String> pics = new HashSet<String>(); String img = ""; Pattern p_image; Matcher m_image; String regEx_img = "<img.*src\\

  • 正确遍历删除List中的元素方法(推荐)

    遍历删除List中的元素有很多种方法,当运用不当的时候就会产生问题.下面主要看看以下几种遍历删除List中元素的形式: 1.通过增强的for循环删除符合条件的多个元素 2.通过增强的for循环删除符合条件的一个元素 3.通过普通的for删除删除符合条件的多个元素 4.通过Iterator进行遍历删除符合条件的多个元素 /** * 使用增强的for循环 * 在循环过程中从List中删除元素以后,继续循环List时会报ConcurrentModificationException */ public

  • java中循环遍历删除List和Set集合中元素的方法(推荐)

    今天在做项目时,需要删除List和Set中的某些元素,当时使用边遍历,边删除的方法,却报了以下异常: ConcurrentModificationException 为了以后不忘记,使用烂笔头把它记录如下: 错误代码的写法,也就是报出上面异常的写法: Set<CheckWork> set = this.getUserDao().getAll(qf).get(0).getActionCheckWorks(); for(CheckWork checkWork : set){ if(checkWor

  • intellij idea快速查看当前类中的所有方法(推荐)

    问题:当一个类中的方法非常多,一个个查看不直观也比较麻烦,如何快速的查看这个类中的所有方法? 按快捷键 Alt+7就能显示当前类中的所有方法.全局常量,方法还包括形参和返回值,一目了然--打开界面如下: 默认的快捷键就是Alt+7,如果你的修改过,就去keymap中设置查看: 总结 到此这篇关于intellij idea快速查看当前类中的所有方法的文章就介绍到这了,更多相关idea查看当前类中的所有方法内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

  • django ListView的使用 ListView中获取url中的参数值方式

    view.py from django.views.generic import ListView,DetailView from xxxx.models import Model_Name class Colortag_view(ListView): #context_object_name = '如果不指定的话在html页面中 可以使用object_list获取' context_object_name = 'object_list' #template_name='html页面所在目录'

  • Android中ListView的几种常见的优化方法总结

    Android中的ListView应该算是布局中几种最常用的组件之一了,使用也十分方便,下面将介绍ListView几种比较常见的优化方法: 首先我们给出一个没有任何优化的Listview的Adapter类,我们这里都继承自BaseAdapter,这里我们使用一个包含100个字符串的List集合来作为ListView的项目所要显示的内容,每一个条目都是一个自定义的组件,这个组件中只包含一个textview: Activity: package com.alexchen.listviewoptimi

  • 老生常谈Listview中onItemClick中的各个参数(推荐)

    要实现点击上面listview中每一行中的请假就会获得该行的人名来调用相应的webservice接口, departmenttongji_item: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" a

  • 浅谈Android开发中ListView控件性能的一些优化方法

    ListView优化一直是一个老生常谈的问题,不管是面试还是平常的开发中,ListView永远不会被忽略掉,那么这篇文章我们来看看如何最大化的优化ListView的性能. 1.在adapter中的getView方法中尽量少使用逻辑 2.尽最大可能避免GC 3.滑动的时候不加载图片 4.将ListView的scrollingCache和animateCache设置为false 5.item的布局层级越少越好 6.使用ViewHolder 下面就具体来看一些 1.在adapter中的getView方

随机推荐