Фильтр или поиск JSON данных - PullRequest
0 голосов
/ 08 февраля 2020

Я создал фильтруемый метод в своем классе адаптера. План заключается в том, чтобы этот метод позволял пользователю фильтровать данные 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"/>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...