2017-09-13 80 views
0

我正在處理一個筆記應用程序,從而將添加的筆記顯示在listView中。 我包含一個搜索欄作爲其中一個菜單項,以便在用戶嘗試搜索時過濾各個筆記。 現在,我已經實現了我的listView的可過濾功能,但它不能按預期工作。當用戶開始輸入字母時,它不會自動過濾。在SearchView上實現自動過濾器android

用戶必須通過點擊設備上的輸入按鈕來手動執行搜索功能,即使searchView爲空,listView項目也不會再出現。 如何確保在用戶開始鍵入字母時自動完成搜索功能,就像大多數搜索功能一樣?

// menumain.xml 

    <menu xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:app="http://schemas.android.com/apk/res-auto" 
     xmlns:tools="http://schemas.android.com/tools" 
     tools:context=".MainActivity"> 
     <item 
      android:id="@+id/search" 
      android:orderInCategory="100" 
      app:actionViewClass= "android.support.v7.widget.SearchView" 
      app:showAsAction="ifRoom" 
      android:icon="@drawable/ic_search" 
      android:title="@string/search" /> 



    </menu> 

     //Main Activity 
      @Override 
    public boolean onQueryTextSubmit(String query) { 
     return false; 
    } 

    @Override 
    public boolean onQueryTextChange(String query) { 
     na.getFilter().filter(query); 
     if (!query.equals("")) { 
      na.getFilter().filter(query); 
      nb.getFilter().filter(query); 
     } else { 
      mListNotes.setAdapter(na); 
      mGridNotes.setAdapter(nb); 
     } 
     return false; 
    } 
} 
// Note.java 
public class Note implements Serializable { 

    private long mDateTime; //creation time of the note 
    private String mTitle; //title of the note 
    private String mContent; //content of the note 

    public Note(long dateInMillis, String title, String content) { 
     mDateTime = dateInMillis; 
     mTitle = title; 
     mContent = content; 
    } 


    public void setDateTime(long dateTime) { 
     mDateTime = dateTime; 
    } 

    public void setTitle(String title) { 
     mTitle = title; 
    } 

    public void setContent(String content) { 
     mContent = content; 
    } 

    public long getDateTime() { 
     return mDateTime; 
    } 
    public String getTitle() { 
     return mTitle; 
    } 

    public String getContent() { 
     return mContent; 
    } 
} 

    // Note List Adapter 

    class NoteListAdapter extends ArrayAdapter<Note> implements Filterable{ 
     List<Note> objects; 
     private List<Note> mStringFilterList; 
     Filter filter; 
     private static final int WRAP_CONTENT_LENGTH = 5; 
     public NoteListAdapter(Context context, int resource, List<Note> objects) { 
      super(context, resource, objects); 
      this.objects = objects; 
      this.mStringFilterList = objects; 

     } 

     @Override 
     public int getCount() { 
      return objects.size(); 
     } 

     @Nullable 
     @Override 
     public Note getItem(int position) { 
      return objects.get(position); 
     } 

     @Override 
     public long getItemId(int position) { 
      return position; 
     } 


     @Override 
     public Filter getFilter() { 
      filter = new Filter() { 
       @Override 
       protected FilterResults performFiltering(CharSequence constraint) { 
        ArrayList<Note> tempList= new ArrayList<>(); 
        FilterResults results = new FilterResults(); 
        if (constraint != null && objects != null) { 
         for(Note singleNote : objects) { 
          if(singleNote.getTitle().contains(constraint)) 
           tempList.add(singleNote); 
         } 
         results.values = tempList; 
         results.count = tempList.size(); 
        } 

        return results; 
       } 
       @Override 
       protected void publishResults(CharSequence constraint, FilterResults results) { 
        objects = (ArrayList<Note>) results.values; 
        notifyDataSetChanged(); 

       } 
      }; 
      return filter; 
     } 

      } 

      return convertView; 
     } 


    } 
+1

請在會告訴你現在的搜索查看 –

+0

作品的每個字符的用戶類型篩選結果,但我如何'onQueryTextChange'方法過濾當searchView爲空時,讓listview項目恢復正常?我需要一個刷新邏輯,使項目回來時,沒有文字在SearchView – Benfight

+0

請在onQueryTextChange – Benfight

回答

0

您還需要在onQueryTextChange方法中添加過濾代碼。每次從鍵盤觸發擊鍵時都會調用此方法。

不喜歡這在主要活動上:

//Main Activity 
@Override 
public boolean onQueryTextSubmit(String query) { 
    na.getFilter().filter(query); 
    nb.getFilter().filter(query); 
    return true; 
} 

@Override 
public boolean onQueryTextChange(String newText) { 
    na.getFilter().filter(newText); 
    nb.getFilter().filter(newText); 
    return true; 
} 
+0

現在的作品審查我更新的代碼,但我如何使listView項目恢復正常時searchView爲空? – Benfight

+0

我需要一個刷新邏輯,使項目回來時,沒有文字SearchView – Benfight

+0

請在onQueryTextChange回顧我更新的代碼 – Benfight