Header Ads

[Android ] ListView with index and search


Lấy project có Index đã được share: 

     1.       Download project tại địa chỉ bên dưới và unzip thành 1 thư mục có tên là “IndexableListView-master” :
     2.       Chép thư mục vào thư mục workspace. Trong Eclipse chọn File -> Import. Trong cửa sổ import chọn Android-> Existing Android Code Into Workspace rồi Next (chú ý: không phải trong mục General nhé).

3.       Trong hộp thoại  “Import Projects” dẫn đường dẫn đến thư mục project. Trong mục “Projects” check để chọn project. Check thêm mục “Copy projects into workspace” (nếu chưa copy project vào workspace) rồi chọn Finish.
4.       Project đã được thêm vào và có 3 package như sau

5.       Chú ý: nếu chưa có thư mục “Android <version>” thì click phải  project chọn Properties, chọn tab Android check vào 1 máy ảo vd: Android 2.2 rồi OK.
6.       Ba package sẽ còn báo lỗi ta phải sửa chúng. Đầu tiên mở file StringMatcher.java. Trong file này do hỗ trợ ngôn ngữ Korea nên sẽ bị lỗi, ta cần sửa lại các biến của class này như sau:
   private final static char KOREAN_UNICODE_START = 'a';
   private final static char KOREAN_UNICODE_END = 'z';
   private final static char KOREAN_UNIT = 'a';
   private final static char[] KOREAN_INITIAL = {'a','b'};
  
7.       Mở tiếp file IndexableListViewActivity.java lên, bỏ các câu @override ở trên các hàm getPositionForSection, getSectionForPosition, getSections.
8.       Sau khi sửa xong ta thấy project không còn bị lỗi gì nữa (nếu có lỗi thì tự vọc rồi sửa tiếp). Chạy chương trình để thấy kết quả hiện lên như sau:

Đưa vào Project của ta.

9.       Tạo project mới tên vd: mylistviewdemo1.
10.   Copy 3 package từ project mẫu chép vào project của ta.  Mở file IndexableListViewActivity.java lên, dùng dấu // để bỏ câu lệnh setContextView (do không chép layout qua) rồi Save all.
11.   Ta vẫn còn thấy báo lỗi ở câu bên dưới (không sao cả).

12.   Mở file layout của chương trình mẫu, copy phần listview. Sau đó mở file layout chương trình của ta, đổi nút gốc thành LinearLayout, chỉnh cho nó là vertical. Kéo vào 1 editText (để làm search) và paste listview vào dưới EditText. Toàn bộ mã sẽ như sau:
<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" >

    <EditText
        android:id="@+id/editText1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10" >
        <requestFocus />
    </EditText>
   
   <com.woozzu.android.widget.IndexableListView
       android:layout_width="fill_parent"
       android:layout_height="fill_parent"
       android:id="@+id/listview" />

</LinearLayout>
13.   Chú ý file IndexableListViewActivity.java đó chính là file Activity chính trong project ta có thể dùng luôn nó hoặc copy source của nó để đưa vào MainActivity.java. Ta sẽ copy. Mở 2 file lên đầu tiên copy 2 biến toàn cục.
   private ArrayList<String> mItems;
   private IndexableListView mListView;
  
14.   Tiếp theo copy phần dữ liệu cho listview trong hàm onCreate (chỉ copy đến phần sort), đây là dữ liệu của listview ta có thể thay đổi theo project của ta.
        mItems = new ArrayList<String>();
        mItems.add(“Diary of a Wimpy Kid 6: Cabin Fever”);
        mItems.add(“Steve Jobs”);
        mItems.add(“Inheritance (The Inheritance Cycle)”);
        mItems.add(“11/22/63: A Novel”);
        mItems.add(“The Hunger Games”);
        mItems.add(“The LEGO Ideas Book”);
        mItems.add(“Explosive Eighteen: A Stephanie Plum Novel”);
        mItems.add(“Catching Fire (The Second Book of the Hunger Games)”);
        mItems.add(“Elder Scrolls V: Skyrim: Prima Official Game Guide”);
        mItems.add(“Death Comes to Pemberley”);
        mItems.add(“Diary of a Wimpy Kid 6: Cabin Fever”);
        mItems.add(“Steve Jobs”);
        mItems.add(“Inheritance (The Inheritance Cycle)”);
        mItems.add(“11/22/63: A Novel”);
        mItems.add(“The Hunger Games”);
        mItems.add(“The LEGO Ideas Book”);
        mItems.add(“Explosive Eighteen: A Stephanie Plum Novel”);
        mItems.add(“Catching Fire (The Second Book of the Hunger Games)”);
        mItems.add(“Elder Scrolls V: Skyrim: Prima Official Game Guide”);
        mItems.add(“Death Comes to Pemberley”);
        Collections.sort(mItems);
15.   Tiếp theo sẽ copy phần class nội, đây là class adapter của ta, chú ý, paste nó ngoài hàm onCreate nhé.
    private class ContentAdapter extends ArrayAdapter<String> implements SectionIndexer {
         
          private String mSections = "#ABCDEFGHIJKLMNOPQRSTUVWXYZ";
         
          public ContentAdapter(Context context, int textViewResourceId,
                        List<String> objects) {
                 super(context, textViewResourceId, objects);
          }

          public int getPositionForSection(int section) {
                 // If there is no item for current section, previous section will be selected
                 for (int i = section; i >= 0; i--) {
                        for (int j = 0; j < getCount(); j++) {
                               if (i == 0) {
                                      // For numeric section
                                      for (int k = 0; k <= 9; k++) {
                                             if(StringMatcher.match(String.valueOf(getItem(j).charAt(0)), String.valueOf(k)))
                                                   return j;
                                      }
                               } else {
                                      if(StringMatcher.match(String.valueOf(getItem(j).charAt(0)), String.valueOf(mSections.charAt(i))))
                                                   return j;
                               }
                        }
                 }
                 return 0;
          }

          public int getSectionForPosition(int position) {
                 return 0;
          }

          public Object[] getSections() {
                 String[] sections = new String[mSections.length()];
                 for (int i = 0; i < mSections.length(); i++)
                        sections[i] = String.valueOf(mSections.charAt(i));
                 return sections;
          }
    }
16.   Tiếp theo quay lại hàm onCreate copy phần gán adapter cho listview.
        ContentAdapter adapter = new ContentAdapter(this,
                android.R.layout.simple_list_item_1, mItems);
       
        mListView = (IndexableListView) findViewById(R.id.listview);
        mListView.setAdapter(adapter);
        mListView.setFastScrollEnabled(true);
17.   Chú ý lên phần import, bỏ các import bị sai.
18.   Cuối cùng package chứa file “IndexableListViewActivity.java” không còn cần thiết nữa, delete package này cùng với file trong nó.
19.   Chạy chương trình để xem kết quả.

Thêm chức năng search nhanh trên listView.

20.   EditText trên giao diện đã được thêm vào. Giờ ta khai báo toàn cục nó và ánh xạ nó trong hàm onCreate.
21.   Trong onCreate ta bắt sự kiện addTextChangedListener cho EditText.
    et.addTextChangedListener(new TextWatcher() {
         
          public void onTextChanged(CharSequence s, int start, int before, int count) {
                 // TODO Auto-generated method stub
                
          }
         
          public void beforeTextChanged(CharSequence s, int start, int count,
                        int after) {
                 // TODO Auto-generated method stub
                
          }
         
          public void afterTextChanged(Editable s) {
                 // TODO Auto-generated method stub
                
          }
   });

22.   Trong hàm onTextChanged của EditText cần dùng adapter nên phải sửa ContextAdapter thành toàn cục.

23.   Cuối cùng trong hàm onTextChanged ta gọi filter cho adapter.
   public void onTextChanged(CharSequence s, int start, int before, int count) {
          // TODO Auto-generated method stub
          adapter.getFilter().filter(s);
   }
24.   Chạy chương trình, thử gõ vào dữ liệu vào EditText để kiểm tra kết quả.


No comments:

Powered by Blogger.