RecyclerView使用SearchView过滤器后无法排序
RecyclerView cannot be sorted after using SearchView filter
我正在尝试使用 SearchView 实现一个简单的搜索按钮,以在 RecyclerView 中查找项目。但是,这个搜索按钮破坏了我的排序功能,因为在 SearchView 中输入后无法再对 RecyclerView 进行排序。
这是我的 Activity
private void sortAscending() {
Collections.sort(stationList, (station1, station2) -> {
if (station1.getData().getCurrent().getPollution().getAqius() > station2.getData().getCurrent().getPollution().getAqius()) {
return 1;
} else if (station1.getData().getCurrent().getPollution().getAqius() < station2.getData().getCurrent().getPollution().getAqius()) {
return -1;
} else {
return 0;
}
});
}
private void sortDescending() {
Collections.sort(stationList, (station1, station2) -> {
if (station1.getData().getCurrent().getPollution().getAqius() > station2.getData().getCurrent().getPollution().getAqius()) {
return -1;
} else if (station1.getData().getCurrent().getPollution().getAqius() < station2.getData().getCurrent().getPollution().getAqius()) {
return 1;
} else {
return 0;
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//Inflate the menu here
getMenuInflater().inflate(R.menu.list_menu, menu);
MenuItem searchItem = menu.findItem(R.id.item_search);
SearchView searchView = (SearchView) searchItem.getActionView();
searchView.setOnQueryTextListener(this);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
//A String for the message to be displayed in a Toast
String msg = "";
//Switch and case on the MenuItem object's id
switch (item.getItemId()) {
case R.id.sort_ascending:
msg = "sorting by ascending.";
sortAscending();
Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
break;
case R.id.sort_descending:
msg = "sorting by descending.";
sortDescending();
Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
break;
}
adapter.notifyDataSetChanged();
return super.onOptionsItemSelected(item);
}
@Override
public boolean onQueryTextChange(String newText) {
filter(newText.toLowerCase());
return true;
}
private void filter(String text) {
ArrayList<Station> filteredList = new ArrayList<>();
for (Station item : stationList) {
if (item.getData().getCity().toLowerCase().contains(text.toLowerCase())) {
filteredList.add(item);
}
}
adapter.filterList(filteredList);
adapter.notifyDataSetChanged();
}
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
现在我怀疑它与 onOptionsItemSelected
方法有关,因为当用户单击菜单上的搜索按钮时,我没有执行任何操作。
这是 RecyclerView 的适配器 class,为简单起见删除了其他功能。
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
//...set text and information from ArrayList
//Launch an activity and user clicks on an item in RecyclerView
holder.itemView.setOnClickListener(view -> {
Intent intent = new Intent(context, CityActivity.class);
context.startActivity(intent);
});
}
//Function to set the ArrayList to the filtered list
//filteredList ArrayList is passed in from filter() in Activity
public void filterList(ArrayList<Station> filteredList) {
stationList = filteredList;
}
这是菜单的 XML:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/item_sort"
android:icon="@drawable/ic_sort_black_24dp"
android:title="Sort"
app:showAsAction="ifRoom">
<menu>
<item android:id="@+id/sort_ascending"
android:title="Sort by ascending"/>
<item android:id="@+id/sort_descending"
android:title="Sort by descending"/>
</menu>
</item>
<item android:id="@+id/item_search"
android:icon="@drawable/ic_search_black_24dp"
android:title="Search"
app:showAsAction="always"
app:actionViewClass="android.support.v7.widget.SearchView"/>
</menu>
我无法弄清楚为什么在将信息输入 SearchView 并将其删除以便 RecyclerView returns 恢复到正常状态后,我无法使用排序功能(升序和降序)对 RecyclerView 进行排序.
我已经通过检查文本长度是否为零解决了我的问题,这意味着没有输入文本并且用户没有使用搜索。然后我调用 filterList
函数将当前站列表设置为要显示的站列表。
private void filter(String text) {
if (text.length() == 0) {
adapter.filterList(stationList);
} else {
ArrayList<Station> filteredList = new ArrayList<>();
for (Station item : stationList) {
if (item.getData().getCity().toLowerCase().contains(text.toLowerCase())) {
filteredList.add(item);
}
}
adapter.filterList(filteredList);
}
}
为了清楚起见,我还将 adapter.notifyDataSetChanged();
移到了 filterList
函数中。
我正在尝试使用 SearchView 实现一个简单的搜索按钮,以在 RecyclerView 中查找项目。但是,这个搜索按钮破坏了我的排序功能,因为在 SearchView 中输入后无法再对 RecyclerView 进行排序。
这是我的 Activity
private void sortAscending() {
Collections.sort(stationList, (station1, station2) -> {
if (station1.getData().getCurrent().getPollution().getAqius() > station2.getData().getCurrent().getPollution().getAqius()) {
return 1;
} else if (station1.getData().getCurrent().getPollution().getAqius() < station2.getData().getCurrent().getPollution().getAqius()) {
return -1;
} else {
return 0;
}
});
}
private void sortDescending() {
Collections.sort(stationList, (station1, station2) -> {
if (station1.getData().getCurrent().getPollution().getAqius() > station2.getData().getCurrent().getPollution().getAqius()) {
return -1;
} else if (station1.getData().getCurrent().getPollution().getAqius() < station2.getData().getCurrent().getPollution().getAqius()) {
return 1;
} else {
return 0;
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//Inflate the menu here
getMenuInflater().inflate(R.menu.list_menu, menu);
MenuItem searchItem = menu.findItem(R.id.item_search);
SearchView searchView = (SearchView) searchItem.getActionView();
searchView.setOnQueryTextListener(this);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
//A String for the message to be displayed in a Toast
String msg = "";
//Switch and case on the MenuItem object's id
switch (item.getItemId()) {
case R.id.sort_ascending:
msg = "sorting by ascending.";
sortAscending();
Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
break;
case R.id.sort_descending:
msg = "sorting by descending.";
sortDescending();
Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
break;
}
adapter.notifyDataSetChanged();
return super.onOptionsItemSelected(item);
}
@Override
public boolean onQueryTextChange(String newText) {
filter(newText.toLowerCase());
return true;
}
private void filter(String text) {
ArrayList<Station> filteredList = new ArrayList<>();
for (Station item : stationList) {
if (item.getData().getCity().toLowerCase().contains(text.toLowerCase())) {
filteredList.add(item);
}
}
adapter.filterList(filteredList);
adapter.notifyDataSetChanged();
}
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
现在我怀疑它与 onOptionsItemSelected
方法有关,因为当用户单击菜单上的搜索按钮时,我没有执行任何操作。
这是 RecyclerView 的适配器 class,为简单起见删除了其他功能。
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
//...set text and information from ArrayList
//Launch an activity and user clicks on an item in RecyclerView
holder.itemView.setOnClickListener(view -> {
Intent intent = new Intent(context, CityActivity.class);
context.startActivity(intent);
});
}
//Function to set the ArrayList to the filtered list
//filteredList ArrayList is passed in from filter() in Activity
public void filterList(ArrayList<Station> filteredList) {
stationList = filteredList;
}
这是菜单的 XML:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/item_sort"
android:icon="@drawable/ic_sort_black_24dp"
android:title="Sort"
app:showAsAction="ifRoom">
<menu>
<item android:id="@+id/sort_ascending"
android:title="Sort by ascending"/>
<item android:id="@+id/sort_descending"
android:title="Sort by descending"/>
</menu>
</item>
<item android:id="@+id/item_search"
android:icon="@drawable/ic_search_black_24dp"
android:title="Search"
app:showAsAction="always"
app:actionViewClass="android.support.v7.widget.SearchView"/>
</menu>
我无法弄清楚为什么在将信息输入 SearchView 并将其删除以便 RecyclerView returns 恢复到正常状态后,我无法使用排序功能(升序和降序)对 RecyclerView 进行排序.
我已经通过检查文本长度是否为零解决了我的问题,这意味着没有输入文本并且用户没有使用搜索。然后我调用 filterList
函数将当前站列表设置为要显示的站列表。
private void filter(String text) {
if (text.length() == 0) {
adapter.filterList(stationList);
} else {
ArrayList<Station> filteredList = new ArrayList<>();
for (Station item : stationList) {
if (item.getData().getCity().toLowerCase().contains(text.toLowerCase())) {
filteredList.add(item);
}
}
adapter.filterList(filteredList);
}
}
为了清楚起见,我还将 adapter.notifyDataSetChanged();
移到了 filterList
函数中。