edittext + listview 實現搜索listview中的內容

来源:http://www.cnblogs.com/ganchuanpu/archive/2017/03/24/6613286.html
-Advertisement-
Play Games

主要原理:是在主界面有兩個空間,一個是EditText,一個是ListView,ListView是放在EditText下麵的,然後自定義建立一個adapter適配器, 這個適配器要繼承Filterable這個介面,並實現這個介面的兩個方法,一個是過濾方法,一個是過濾後的方法,一般我們是在過濾方法裡面 ...


主要原理:是在主界面有兩個空間,一個是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>  

  

  

  

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 作者:Antonio Leiva 時間:Mar 21, 2017 原文鏈接:https://antonioleiva.com/operator-overload-kotlin/ 就像其他每種語言一樣,在Kotlin中,已經預定義了一些操作符執行一定的操作。 最典型的是加(+),減(-),乘(*),除 ...
  • UINavigationController 返回手勢與 leftBarButtonItem UINavigationController 自帶從屏幕左側邊緣向右滑動的返回手勢,可以通過這個手勢實現 pop,或者 pop 中途取消 pop 而停留在當前控制器(UIViewController)。如果 ...
  • 前言 因為 "實戰項目系列" 涉及到數據持久化,這邊就來補充一下。 如本文有錯或理解偏差歡迎聯繫我,會儘快改正更新! 如有什麼問題,也可直接通過郵箱 [email protected] 聯繫我。 demo鏈接: https://pan.baidu.com/s/1hsspiio 密碼: dk3h 數據持 ...
  • UICollectionView 適配 iPhone 7 Plus 需求:在屏幕上水平放置 5 張正方形圖片,每張圖片的寬度相等,無縫隙排列鋪滿一個屏幕寬度。 看似很簡單的需求。用 UICollectionView 實現的話,把 UICollectionView 的寬度設置為屏幕寬度;屏幕寬度除以 ...
  • 譯者註:由於本人水平有限,譯文中難免會出現概念模糊、晦澀難懂,如果實在沒心思看下去,請發揮你的學習能動性,到原文中自行翻譯,感謝!!!點 "這裡" ,直達英文各種長句的世界。 好了,既然你選擇繼續往下看,那就一起來學習吧!!! 譯者:Noddy 地址: "直流電路理論" 如果你喜歡本譯文,請到項目上 ...
  • 1.應用程式 Android會同一系列核心應用程式包一起發佈,該應用程式包包括email客戶端,SMS短消息程式,日曆,地圖,瀏覽器,聯繫人管理程式等。所有的應用程式都是使用JAVA語言編寫的。 2.應用程式框架 開發人員也可以完全訪問核心應用程式所使用的API框架。該應用程式的架構設計簡化了組件的 ...
  • 有這樣一個ListView,要求在屏幕底部有一個篩選排序的浮動框: 1、手指下拉隱藏,上滑顯示 ; 2、如果沒做任何操作,2S之後,要自動顯示; 3、滑動到最底部,始終顯示。 首先看其效果圖: 實現上述效果,其實現原理如下: 1、在屏幕頂部固定一個BottomView,XML佈局最好使用Relati ...
  • 有一個Button 按鈕,要想為該按鈕設置onClick事件和OnTouch事件 此時,我們現在分析一下,是onTouch先執行,還是onClick執行,接下來我從FrameWork 源碼去探尋一下整個事件的執行流程和原理: 我們知道 Button ,TextView 等基礎控制項的基類都是View, ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...