Я создал фильтруемый метод в своем классе адаптера. План заключается в том, чтобы этот метод позволял пользователю фильтровать данные JSON для конкретной статьи c. Все выглядит правильно для меня, но когда я запускаю приложение, оно падает. Я все еще немного новичок в программировании, поэтому я не знаю, является ли этот код проблемой или нет. Любая оказанная помощь будет принята с благодарностью.
ErrorLog читает это:
java.lang.ClassCastException: androidx.appcompat.widget.SearchView cannot be cast to android.widget.SearchView
at newsapp.news.onCreateOptionsMenu(news.java:177)
at android.app.Activity.onCreatePanelMenu(Activity.java:3496)
at androidx.fragment.app.FragmentActivity.onCreatePanelMenu(FragmentActivity.java:378)
at androidx.appcompat.view.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:94)
at androidx.appcompat.app.AppCompatDelegateImpl$AppCompatWindowCallback.onCreatePanelMenu(AppCompatDelegateImpl.java:2549)
at androidx.appcompat.app.AppCompatDelegateImpl.preparePanel(AppCompatDelegateImpl.java:1589)
at androidx.appcompat.app.AppCompatDelegateImpl.doInvalidatePanelMenu(AppCompatDelegateImpl.java:1869)
at androidx.appcompat.app.AppCompatDelegateImpl$2.run(AppCompatDelegateImpl.java:230)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:205)
at android.app.ActivityThread.main(ActivityThread.java:6892)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:860)
Вот мой код фильтра:
public Filter getFilter(){
return newsFilter;
}
private Filter newsFilter = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
List<newsItem> filteredList = new ArrayList<>();
if (constraint == null || constraint.length() ==0){
filteredList.addAll(mNewsListFull);
}else {
String filterPattern = constraint.toString().toLowerCase().trim();
for (newsItem item : mNewsListFull){
if (item.getDescription().toLowerCase().contains(filterPattern)) {
filteredList.add(item);
}
}
}
FilterResults results = new FilterResults();
results.values= filteredList;
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
mNewsList.clear();
mNewsList.addAll((List)results.values);
notifyDataSetChanged();
}
};
Вот мой код активности новостей, где я вызываю всплывающее меню
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_main,menu);
MenuItem searchItem = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView)searchItem.getActionView();
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
mNewsAdapter.getFilter().filter(newText);
return false;
}
});
return true;
}
И, конечно же, мое меню 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=".news"
>
<item
android:id="@+id/action_search"
android:orderInCategory="100"
android:title="Search"
android:icon="@drawable/ic_search"
app:showAsAction="ifRoom|collapseActionView"
app:actionViewClass="androidx.appcompat.widget.SearchView"
android:theme="@android:style/Theme.Holo.Light.DarkActionBar"/>