我想在片段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;
}
答案 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--;
}
}
注意:每次搜索时,都要克隆原始数据以进行查找。
这是我的主意。