.:: CODE SNIPPET ::.

"Your time is limited, so don't waste it living someone else's life"

Thêm chức năng search vào listview trong android


Trước đây mình có viết bài viết về lọc danh sách phức tạp và với tiếng Việt trong ListView. Còn trong bài này, thì nó đơn giản hơn chỉ với tiếng Anh cũng như danh sách đơn giản hơn nhiều.
Chức năng search trong ListView sẽ lọc danh sách dữ liệu theo cái chuỗi mà bạn nhập vào. Bài viết sau đây cung cấp một cách dễ dàng để tìm kiếm thông tin mà bạn cần.
1.Đầu tiên bạn tạo ra một project
2.Tiếp theo bạn cần tạo ra mộ ListView trong file layout. Ở đây ListView của chúng ta chỉ bao gồm một chuỗi cho mỗi dòng thôi. Trong file xml này, chúng ta cần tạo ra một giao diện bao gồm một EditText bên trên để có thể nhập chuỗi cần tìm, và bên dưới là một ListView.
activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    <EditText android:id="@+id/inputSearch"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="Search products.."
        android:inputType="textVisiblePassword"/>
    <ListView
        android:id="@+id/list_view"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />
 
</LinearLayout>

Tiếp theo là layout của một thành phần trong danh sách
list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView android:id="@+id/product_name"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:padding="10dip"
        android:textSize="16dip"
        android:textStyle="bold"/>    
 
</LinearLayout>

3.Bây giờ sử dụng lớp MainActivity để tạo ra dữ liệu cho ListView của chúng ta. Ở đây, chúng ta sẽ sử dụng một mãng các chuỗi để tạo ra một Adapter cho danh sách, và sau đó, chúng ta sẽ ‘nhét’ cái Adapter này vào trong danh sách để hiển thị lên.

mport java.util.ArrayList;
import java.util.HashMap;
import android.app.Activity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
 
public class MainActivity extends Activity {
    private ListView lv;
    private ArrayAdapter<String> adapter;
    private EditText inputSearch;
    private ArrayList<HashMap<String, String>> productList;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        String products[] = {"Dell Inspiron", "HTC One X", "HTC Wildfire S", "HTC Sense", "HTC Sensation XE",
                                "iPhone 4S", "Samsung Galaxy Note 800",
                                "Samsung Galaxy S3", "MacBook Air", "Mac Mini", "MacBook Pro"};
 
        lv = (ListView) findViewById(R.id.list_view);
        inputSearch = (EditText) findViewById(R.id.inputSearch);
 
        adapter = new ArrayAdapter<String>(this, R.layout.list_item, R.id.product_name, products);
        lv.setAdapter(adapter);       
 
    }

Lúc này khi chạy chương trình ta sẽ có như sau:

4.Tiếp theo là phần chính yếu, tạo ra bộ lọc cho danh sách
Chức năng lọc có thể được tạo ra một cách dễ dàng bằng cách thêm vào EditText sự kiện addTextChangedListener như sau:

inputSearch.addTextChangedListener(new TextWatcher() {
 
    @Override
    public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
        // When user changed the Text
        MainActivity.this.adapter.getFilter().filter(cs);
    }
 
    @Override
    public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
            int arg3) {
        // TODO Auto-generated method stub
 
    }
 
    @Override
    public void afterTextChanged(Editable arg0) {
        // TODO Auto-generated method stub
    }
});
[/souececode]
<strong>5.</strong>Cuối cùng là thêm vào <strong>AndroidManifest.xml</strong> để dấu đi keyboard khi load Activity

android:windowSoftInputMode="stateHidden"

Thế là hoàn tất, khi đó bạn có thể sử dụng chức năng lọc đơn giản này smoothly như hình sau:

Các bạn có thể download sourcecode tại đây

Advertisements

29 responses to “Thêm chức năng search vào listview trong android

  1. Pingback: Sử dụng ListView căn bản « .:: Lập Trình Căn Bản ::.

  2. tony hoàng December 25, 2012 at 10:38 AM

    Mình cũng test thử đoạn code trên rùi nhưng lúc mình test với dữ liệu tầm 1000000 reco thì nó rất giạt và tìm kiếm sẽ bị unforturnatery.. bạn có cách nào giúp mình với lượng dữ liệu lớn đc không. thanks

  3. Hoàng Minh December 26, 2012 at 12:21 AM

    Mình nghĩ là do khi dữ liệu quá lớn, thì bạn nên sử dụng hàm OnScrollListener để xác định dữ liệu cuối cùng trong adaper được hiển thị và sau đó, bạn load thêm dữ liệu và đổ vào adapter thì sẽ an toàn hơn.
    Nếu không được nữa, bạn có thể gửi cho mình phần logcat để mình rõ hơn về lỗi nhé.

  4. nvc91 January 17, 2013 at 2:31 PM

    bạn ơi có thể share cho mình source của bài này được không.
    mail mình là: c100nvc@gmail.com
    thanks bạn nhiều!

  5. Hoàng Minh January 18, 2013 at 12:23 PM

    Bạn nvc91 download ở đây nhé: https://docs.google.com/file/d/0B9z5tDAY2GTOMXRBYjRTajRMM2M/edit

  6. Đinh Văn Đông February 18, 2013 at 11:51 AM

    Bạn ơi ListView của mình gồm có cả Image, text. Việc search sẽ xử lý như thế nào? Và cá dữ liệu của mình là dữ liệu động load từ server !!!!

  7. Hoàng Minh February 18, 2013 at 1:46 PM

    Bạn nên xử lý cho chương trình khi load dữ liệu về thì mã hóa và lưu vào bộ nhớ của device,và khi có dữ liệu mới được cập nhật trên server thì chương trình chỉ load về những phần thêm đó mà thôi.
    Thì khi search thì phần text thì đơn giản, nhưng nếu có thêm cả hình ảnh vào, thì nó sẽ rất chậm nếu cứ để load trên mạng về. Vì vậy, chương trình của bạn nên cho load dữ liệu dưới phần cứng của máy lên là chủ yếu.
    Một điều nữa là, theo ý mình, nên xử lý thread cho từng hình ảnh khi load, để chương trình của bạn không bị treo khi gặp một hình ảnh nặng.

  8. nvc91 March 12, 2013 at 5:49 PM

    sao mình vào thấy tùm lum vậy bạn, bạn thông cảm nén lại giúp cho mình 1 file được không?
    cảm ươn bạn rất nhiều!

  9. Hoàng Minh March 12, 2013 at 9:22 PM

    Mình đã nén thành zip rồi mới gửi cho bạn đó mà,bạn download xuống đi nha.

  10. Cuong March 14, 2013 at 9:31 AM

    cho mình xin source code hoàn chỉnh với nhé, mail của mình: pcaocuong@gmail.com

  11. Hoàng Minh March 14, 2013 at 4:41 PM

    của bạn đây nha https://docs.google.com/file/d/0B9z5tDAY2GTOMXRBYjRTajRMM2M/edit

  12. nvc91 March 16, 2013 at 6:42 PM

    bạn Minh cho mình hỏi, hiện tai mình đang làm 1 project tra cứu bài hát karaoke. Cơ sở dữ liệu mình dùng là SQLite và mình đã có sãn 1 file sqlite.
    Chương trình mình thiết kế theo TABs (4tabs). Ơ tab thứ nhất, mình thiết kế có 1 textedit và 1 listview, mình sẽ đổ dữ liệu ra listview và dùng textedit để tìm tên bài hát bằng cách nhập vào tên bài hát, mã bài hát,…và sau đó hiển thị kết quả trên listview lun. Nhưng hiện tại thì mình vẫn chưa thể kết nối dữ liệu cho project được vì hầu hết các ví dụ mà mình search được toàn làm theo kiểu tự code ra 1 sqlite database bằng file java trong project lun
    vậy bạn có thể giúp đỡ cho mình vấn đề này được không hoặc có code về vấn đề trên mong bạn share giúp !
    chân thành cảm ơn bạn!

  13. unknown April 18, 2013 at 3:42 PM

    Sorry chủ blog, mình xin comment với 1 số bạn bên dưới, hi vọng chúng ta sẽ học thêm nhiều kỹ thuật cho Android Programming.

    @tony hoàng:
    Thường thì phải làm ViewHolder để chứa database từ adapter để khi nạp vô listview sẽ không bị lag. Bạn thử xem thế nào nhé.

    @Đinh Văn Đông:
    Thực tế ít ai dùng listview đơn giản như thế này, để sinh động cho 1 listview, từng item sẽ bao gồm image, text, button, .. nói chung là view widget đều vô item được. Để làm cái này thì người ta thường dùng CustomAdapter, bạn có thể tìm source trên mạng rất nhiều.

    @nvc91:
    Trên mạng là làm theo lý thuyết thôi bạn ơi, thực tế đối với những apps cần có sẵn database thì người ta dùng tool (SQLite Management Firefox add-on chẳng hạn) để tạo database trước rồi dùng File Explorer trong bộ Android SDK để port vô project. Trong nghề gọi là cheatcode, làm vậy khi app mới mở lên không phải mất thời gian tạo database ( hix tạo database mà lâu quá thì customer gỡ app ra liền 😥 ).

  14. Hoàng Minh April 20, 2013 at 2:11 PM

    Cảm ơn bạn đã đóng nhiệt tình chia sẽ.
    Ở đây, customer thì không động chạm gì đến database của ứng dụng, họ chỉ việc dùng thôi, nên programmer chơi kiểu gì thì tùy để có thể có database chính xác và nhanh nhất.

  15. Pingback: Sử dụng ListView căn bản | Lập Trình Căn Bản

  16. Hoàng Minh May 24, 2013 at 1:47 PM

    Bạn nvc91;
    Các các thiết bị di động hỗ trợ SQLite, các đoạn code mà bạn đọc được trên mạng nhằm mục đích là tạo ra database, tạo table, này nọ. Điều này là hiển nhiên, khi người dùng download chương trình về cài đặt và chạy trong lần đầu tiên, thì chương trình của bạn phải thực hiện được chuyện tạo ra database. Nó như là một phần của quá trình cài đặt vậy.
    Vì thế chương trình của bạn cũng cần có viết một đoạn installer như vậy.

  17. Hoàng Minh May 24, 2013 at 1:50 PM

    Việc tạo ra data base với code rất rõ ràng và dễ hiểu. Bạn nên sử dụng code để tạo database vì sẽ giúp bạn kiểm soát nhẹ nhàng chương trình.

  18. Nguyễn Ngọc May 28, 2013 at 10:28 AM

    Cho em hỏi làm sao tìm kiếm tiếng việt được anh.sử dụng addTextChangedListener dc k?

  19. Hoàng Minh May 28, 2013 at 10:22 PM

    À, về việc tiếng Việt thì bạn đọc trong bài viết này nhé: https://tranhoangminh.wordpress.com/2012/05/14/x%E1%BB%AD-ly-tim-ki%E1%BA%BFm-ti%E1%BA%BFng-vi%E1%BB%87t-khong-d%E1%BA%A5u-trong-android-listview/
    Cảm ơn bạn đã đọc bài viết nghen.

  20. Win June 4, 2013 at 2:50 PM

    anh ơi, e đang làm app về từ điển, e đã tạo được listview như a hướng dẫn, vậy giờ e muốn khi bấm vào 1 từ trong listview thì nó sẽ mở ra nghĩa của từ, loại từ,,,v,,v,, thì làm thế nào a?

  21. Hoàng Minh June 5, 2013 at 1:36 PM

    Bạn thêm sự kiện cho từng item tron listview, bằng cách thêm vào adapter hoặc là vào viewholder bạn nhé. Nó cũng có sự khác nhau một chút

  22. Anonymous June 9, 2013 at 9:30 AM

    nếu muốn đổ dữ liệu từ database vào list view thì làm sao hả a.

  23. Anonymous July 29, 2013 at 11:54 AM

    mình muốn load từ database lên thì thay chuỗi String products[] = {} bằng gì bạn

  24. Hoàng Minh July 30, 2013 at 3:01 PM

    Anonymous :

    mình muốn load từ database lên thì thay chuỗi String products[] = {} bằng gì bạn

    mảng dữ liệu trong bài viết này,mình gắn cứng như vậy thôi để đơn giản. Còn khi bạn muốn đọc dữ liệu từ DB lên thì bạn phải giải quyết chuyện thao tác với DB riêng nữa.
    Hơn nữa, dữ liệu dạng chuỗi thuần như thế này thì khá đơn giản để tạo listview, nhưng khi dữ liệu trở nên phức tạp hơn như: một object nào đấy, thì listview sẽ phức tạp hơn.
    Các bạn có thể xem thêm tại các bài viết khác.

    https://tranhoangminh.wordpress.com/2012/02/19/%e1%bb%a9ng-d%e1%bb%a5ng-nh%e1%bb%8f-demo-cho-cac-thao-tac-v%e1%bb%9bi-sqlite-trong-android/

    hoặc

    https://tranhoangminh.wordpress.com/2012/02/17/thao-tac-c%c6%a1-s%e1%bb%9f-d%e1%bb%af-li%e1%bb%87u-sqlite-tren-android/

  25. nguyễn hòa March 8, 2014 at 2:29 PM

    cái này mình cũng thấy giống AutoComplete phải ko nhỉ ? 🙂

  26. Anonymous April 20, 2014 at 4:04 PM

    anh oi cho em hỏi cái em làm cái search nh mà kiểu arrayList của em là kiểu bject thì dùng hàm getFilter() nó bắt add cast to mothod receiver làm thế nào để dùng nó a…

  27. Anonymous April 20, 2014 at 4:05 PM

    Anonymous :
    anh oi cho em hỏi cái em làm cái search nh mà kiểu arrayList của em là kiểu bject thì dùng hàm getFilter() nó bắt add cast to mothod receiver làm thế nào để dùng nó a…

    Anonymous :
    anh oi cho em hỏi cái em làm cái search nh mà kiểu arrayList của em là kiểu object thì dùng hàm getFilter() nó bắt “add cast to mothod receiver” làm thế nào để dùng nó a…

  28. Anonymous April 20, 2014 at 4:07 PM

    search listview .. em dùng arrayList thì làm thế nào để dùng được hàm getFilter()

  29. Anonymous September 9, 2017 at 12:09 AM

    mọi người ơi mình mới học Android nên cho mình hỏi ngu tí cái hàm getFilter() và filter(cs) là để làm gì. Nó có sẵn trong Android hay là mình phải code nó ở Adapter?

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: