2016-01-22 40 views
2

我的Fragment中有一個SearchView和一個RecyclerView,我創建了一個用於添加搜索功能的getFilter方法,但是我的問題是這個SearchView不能正常工作,因爲它應該是我的面臨一個問題,這是解釋如下當SearchView的查詢爲空時在適配器上設置原始列表

一旦我輸入的東西SearchView我得到的結果,但是當我開始刪除我的查詢的最後一個單詞我沒有得到任何結果和執行查詢後當我刪除我的SearchView內的整個文本我不回我原來的列表,而是變得空白RecyclerView

here you can see i performed the search

this is what happens when i delete the keywords (no results)

我這是怎麼產生的GetFilter我的適配器類

private static class UserFilter extends Filter { 

    private final NotesAdapter adapter; 

    private final List<Information> originalList; 

    private final List<Information> filteredList; 

    private UserFilter(NotesAdapter adapter, List<Information> originalList) { 
     super(); 
     this.adapter = adapter; 
     this.originalList = new LinkedList<>(originalList); 
     this.filteredList = new ArrayList<>(); 
    } 

    @Override 
    protected FilterResults performFiltering(CharSequence constraint) { 
     filteredList.clear(); 
     final FilterResults results = new FilterResults(); 

     if (constraint == null || constraint.length() == 0) { 
      filteredList.addAll(originalList); 

     } else { 
      final String filterPattern = constraint.toString().toLowerCase().trim(); 

      for (final Information user : originalList) { 
       if (user.title.contains(filterPattern)) { 
        filteredList.add(user); 
       } 
      } 
     } 
     results.values = filteredList; 
     results.count = filteredList.size(); 
     return results; 
    } 


    @Override 
    protected void publishResults(CharSequence constraint, FilterResults results) { 
     adapter.filteredUserList.clear(); 
     adapter.filteredUserList.addAll((ArrayList<Information>) results.values); 
     adapter.notifyDataSetChanged(); 

    } } 

內,這是怎麼離開這個片段

Search_View.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 

             @Override 
             public boolean onQueryTextSubmit(String Text) { 

              Log.v(""+Text , " searchView TextSubmit"); 
              Log.d("tag", "notesAdapter=" + notesAdapter); 
              notesAdapter.getFilter().filter(Text); 


              return true; 
             } 



             @Override 
             public boolean onQueryTextChange(String newText) { 

              Log.v(""+newText , " searchView TextChange"); 
              Log.d("tag", "notesAdapter=" + notesAdapter); 
              notesAdapter.getFilter().filter(newText); 

              return true; 

             } 
            }); 

,如果有人知道我用這個方法做錯了請請指導我

回答

0

下面是一個工作碼:

片段:

@Override 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 

     final MenuItem item = menu.findItem(R.id.action_search); 
     final SearchView searchView = (SearchView) MenuItemCompat.getActionView(item); 
     searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 

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

      @Override 
      public boolean onQueryTextChange(String query) { 

       final List<Friend> filteredModelList = filter(myFriendsList, query); 
       myFriendsListAdapter.animateTo(filteredModelList); 
       myFriendsRecyclerView.scrollToPosition(0); 

       return true; 
      } 
     }); 
    } 


    private List<Friend> filter(List<Friend> models, String query) { 
     query = query.toLowerCase(); 

     final List<Friend> filteredModelList = new ArrayList<>(); 
     for (Friend model : models) { 
      final String currentAddress = model.getFriendName().toLowerCase(); 
      if (currentAddress.contains(query)) { 
       filteredModelList.add(model); 
      } 
     } 
     return filteredModelList; 
    } 


    @Override 
    public void onViewCreated(View view, Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 

     myFriendsRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); 

     myFriendsList = new ArrayList<>(); 

     initDatasetList(); 

     myFriendsListAdapter = new MyFriendsListAdapter(getActivity(), myFriendsList); 
     myFriendsRecyclerView.setAdapter(myFriendsListAdapter); 
    } 

適配器:

private LayoutInflater mInflater = null; 
    private List<Friend> contactList; 

    public MyFriendsListAdapter(List<Friend> contactList) { 
     this.contactList = contactList; 
    } 

public MyFriendsListAdapter(Context context, List<Friend> models) { 
    mInflater = LayoutInflater.from(context); 
    contactList = new ArrayList<>(models); 
} 

public Friend removeItem(int position) { 
    final Friend model = contactList.remove(position); 
    notifyItemRemoved(position); 
    return model; 
} 

public void addItem(int position, Friend model) { 
    contactList.add(position, model); 
    notifyItemInserted(position); 
} 

public void moveItem(int fromPosition, int toPosition) { 
    final Friend model = contactList.remove(fromPosition); 
    contactList.add(toPosition, model); 
    notifyItemMoved(fromPosition, toPosition); 
} 

public void animateTo(List<Friend> models) { 
    applyAndAnimateRemovals(models); 
    applyAndAnimateAdditions(models); 
    applyAndAnimateMovedItems(models); 
} 


private void applyAndAnimateRemovals(List<Friend> newModels) { 
    for (int i = contactList.size() - 1; i >= 0; i--) { 
     final Friend model = contactList.get(i); 
     if (!newModels.contains(model)) { 
      removeItem(i); 
     } 
    } 
} 

private void applyAndAnimateAdditions(List<Friend> newModels) { 
    for (int i = 0, count = newModels.size(); i < count; i++) { 
     final Friend model = newModels.get(i); 
     if (!contactList.contains(model)) { 
      addItem(i, model); 
     } 
    } 
} 

private void applyAndAnimateMovedItems(List<Friend> newModels) { 
    for (int toPosition = newModels.size() - 1; toPosition >= 0; toPosition--) { 
     final Friend model = newModels.get(toPosition); 
     final int fromPosition = contactList.indexOf(model); 
     if (fromPosition >= 0 && fromPosition != toPosition) { 
      moveItem(fromPosition, toPosition); 
     } 
    } 
} 

朋友類(你的是信息):

public String friendName; 

public String getFriendName() { 
     return friendName; 
    } 

和在XML中的菜單:

<item 
    android:id="@+id/action_search" 
    android:menuCategory="secondary" 
    app:actionViewClass="android.support.v7.widget.SearchView" 
    app:showAsAction="always" 
    android:icon="@android:drawable/ic_menu_search" 
    android:title="@string/search"/> 

希望它有幫助。

+0

嘿@Mor感謝您的幫助:)我重播欣賞這一點,但我的實現方法是有點不同,比你的和我的工作除了一件事,那就是當我的searchView是空的時候我沒有得到我原來的列表顯示在我的RecyclerView –

+0

@remyboys沒問題,如果你需要的代碼,它在這裏:) – MorZa

+0

是啊謝謝你的:D –

相關問題