在片段中的recyclerView上搜索功能

时间:2017-01-18 07:41:30

标签: android

我想在片段RecyclerView上搜索功能,我已成功设置了搜索视图图标。我现在仍然是搜索功能。

我接受一些教程,一些使用github,一些使用我无法知道的变量,我仍然无法理解它们。

我只是知道我看起来需要过滤数据,但我不知道该怎么做。只需在MyAdapter extends RecyclerView上编写过滤函数?怎么样?

有人可以告诉我吗?任何帮助将不胜感激。

这是我的片段创建菜单:

@Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.search_menu, menu);

        SearchView searchView = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.search));
        SearchManager searchManager = (SearchManager) getActivity().getSystemService(Context.SEARCH_SERVICE);
        searchView.setOnQueryTextListener(this);

        searchView.setSearchableInfo(searchManager.getSearchableInfo(getActivity().getComponentName()));


        super.onCreateOptionsMenu(menu, inflater);
    }

我实现了覆盖两个函数的接口:

public class ActivityListDomesticFragment extends Fragment implements SearchView.OnQueryTextListener{
    @Override
    public boolean onQueryTextSubmit(String query) {
        return false;
    }

    @Override
    public boolean onQueryTextChange(String newText) {
       //I just know i have set the filter right here
        return false;
    }
}

这是关于构造函数的RecyclerView类:

public class MyAdapterForList extends RecyclerView.Adapter<MyAdapterForList.MyViewHolder>{

    private Context context;
    private List<ActivityListItem> mDatas;

    public MyAdapterForList(Context context, List<ActivityListItem> datas) {
        super();
        this.context = context;
        mDatas = datas;
    }

4 个答案:

答案 0 :(得分:1)

在您的Activity类中实现SearchView.OnQueryTextListener。然后你可以做这样的事情:

@Override
public boolean onQueryTextChange(String query) {
    //gets the filtered list based on user entered text in search box
    final List<String> filteredList = filter(mList, query);
    //set the filtered list to adapter and do notifydataSetchanged in adapter class
    mAdapter.setFilteredList(filteredList );
  //  mRecyclerView.scrollToPosition(0); not required 
    return true;
}

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

// filters the existing list that's provided to the List Adapter
private List<String> filter(List<DriverInfo> mList, String query) {
    query = query.toLowerCase();

    final List<String> filteredList = new ArrayList<>();
    for(String item : mList){
    if (item.toLowerCase().contains(query)) {
        filteredList.add(item);
        }
    }

    return filteredList;
}

在适配器类中创建方法

public void (List<String> filteredList){
this.mList = filteredList;
notifyDataSetChanged();
}

希望这会对你有所帮助。

答案 1 :(得分:0)

MyAdapterForList上添加此方法:

public void setMDatas( List<ActivityListItem> mDatas){
     this.mDatas = mDatas;
}

以及onQueryTextChange上的片段:

根据List<ActivityListItem>过滤newText,如:

ArrayList<ActivityListItem> filteredList = new ArrayList<>();
for(ActivityListItem item : yourActivityItemList){
 if(newText.equals(item.getYourField())){
   filteredList.add(item); 
 }
}

并使用filteredList:

刷新recyclerview适配器
adapter.setMDatas(filteredList);
adapter.notifyDataSetChanged();

答案 2 :(得分:0)

在适配器类中添加此函数,其中data和filterDAta是您的数组列表。您将在holder类中的任何位置使用数据..

public void  filter(String charText) {

    charText = charText.toLowerCase();
    data.clear();

    if (charText.length() == 0) {

        data.addAll(filteredData);

    }
    else
    {
        for (int i = 0 ; i< filteredData.size() ; i++)
        {    System.out.println("its here5");

            if (filteredData.get(i).getVEHICLE_NO().toLowerCase().contains(charText))
            {
                System.out.println("its here");
                data.add(filteredData.get(i));


            }
        }
    }
     notifyDataSetChanged();

}

这是你的searchView QueryListener

 searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener()   {
           @Override
           public boolean onQueryTextSubmit(String query) {
               return false;
           }

           @Override
           public boolean onQueryTextChange(String newText) {


               mAdapter.filter(newText);

               return true;
           }
       });

从活动Listview点击监听器将是这样的..

 mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {

            Arraylist_Type model = (Arraylist_Type) adapterView.getItemAtPosition(i);

     and use model after that ..
    like model.name();etc..

   }
    });

答案 3 :(得分:-1)

第一。克隆原始数据列表。这将使您的搜索进度不会影响原始数据。

List<ActivityListItem> cloneMDatas = new ArrayList<>();
cloneMDatas.addAll(originalMDatas);

第二。 //I just know i have set the filter right here

for(int i = 0; i < cloneMDatas.size(); i++){
   if (!cloneMDatas.get(i).getName().contains(newText)){
      cloneMDatas.remove(i);
      adapter.notifyItemRemoved(i);
      i--;
   }
}

注意:每次搜索时,都要克隆原始数据以进行查找。

这是我的主意。