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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...