getFilter () генерирует исключение нулевого указателя (вероятно, из-за адаптера инициализации, не может решить его) - PullRequest
1 голос
/ 13 марта 2019

В этот раз я столкнулся с другой проблемой, которую я пытаюсь отфильтровать с помощью поиска в RecyclerView, и, скорее всего, потому что я не знаю, как инициализировать адаптер, в то время как другие методы остаются нормальными, я провел исследование, и этомой окончательный код для Main3Activity;

private static final String TAG = "Main3Activity";
private final String JSON_URL = "https://MYURLXXX" ;
private JsonArrayRequest request ;
private RequestQueue requestQueue ;
private List<Anime> lstAnime ;
private RecyclerView recyclerView ;
private RecyclerViewLiveAdapter adapter;
RecyclerView.LayoutManager layoutManager;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main3);

    lstAnime = new ArrayList<>() ;
    recyclerView = findViewById(R.id.recyclerviewid);
    jsonrequest();



}

private void jsonrequest() {

    request = new JsonArrayRequest(JSON_URL, new Response.Listener<JSONArray>() {
        @Override
        public void onResponse(JSONArray response) {

            JSONObject jsonObject  = null ;

            for (int i = 0 ; i < response.length(); i++ ) {


                try {
                    jsonObject = response.getJSONObject(i) ;
                    Anime anime = new Anime() ;
                    anime.setName(jsonObject.getString("name"));
                    anime.setDescription(jsonObject.getString("description"));
                    anime.setRating(jsonObject.getString("Rating"));
                    anime.setCategorie(jsonObject.getString("categorie"));
                    anime.setStudio(jsonObject.getString("studio"));
                    anime.setImage_url(jsonObject.getString("img"));
                    anime.setLink(jsonObject.getString("link"));
                    anime.setDrm_scheme(jsonObject.getString("drm_scheme"));
                    anime.setDrm_license_url(jsonObject.getString("drm_license_url"));
                    anime.setDrm(jsonObject.getString("drm"));
                    anime.setSubtitle(jsonObject.getString("subtitle"));
                    anime.setSubtitle1(jsonObject.getString("subtitle1"));
                    anime.setSubtitle2(jsonObject.getString("subtitle2"));
                    lstAnime.add(anime);

                } catch (JSONException e) {
                    e.printStackTrace();
                }
                setuprecyclerview(lstAnime);


            }


        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {

        }
    });


    requestQueue = Volley.newRequestQueue(Main3Activity.this);
    requestQueue.add(request) ;


}

private void setuprecyclerview(List<Anime> lstAnime) {


    RecyclerViewLiveAdapter myadapter = new RecyclerViewLiveAdapter(this,lstAnime) ;
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    recyclerView.setAdapter(myadapter);

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu_item,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) {
            if (adapter == null){
            adapter.getFilter().filter(newText);}
            return false;
        }
    });
    return true;

}

}

и части фильтра в моем адаптере;

   @Override
public Filter getFilter() {
    return exampleFilter;
}

private Filter exampleFilter = new Filter() {
    @Override
    protected FilterResults performFiltering(CharSequence constraint) {
        List<Anime> filteredList = new ArrayList<>();

        if (constraint == null || constraint.length() == 0) {
            filteredList.addAll(mDataFull);
        } else {
            String filterpattern = constraint.toString().toLowerCase().trim();

            for (Anime anime : mDataFull) {
                if (anime.getName().toLowerCase().contains(filterpattern)) {
                    filteredList.add(anime);
                }
            }
        }

        FilterResults results = new FilterResults();
        results.values = filteredList;
        return results;
    }

    @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {
        mData.clear();
        mData.addAll((List) results.values);
        notifyDataSetChanged();

    }
};

Как вы можете видеть, я использую метод setuprecyclerview();этот метод после получения ответа JSON инициализирует адаптер. Но с этим кодом, не меняя ничего, невозможно установить адаптер после фильтрации

if (adapter == null){
            adapter.getFilter().filter(newText);}
            return false;

Если я изменю adapter == null на adapter != null функцию поиска и раскладки клавиатуры-вверх, но он не запускает событие фильтра, весь просмотр реселлера остается тем же. Так что, когда я оставляю его как адаптер == ноль, он выбрасывает NPE, если вы посмотрите вниз, вы увидите, что getFilter в моем адаптере равен нулю, потому что яневозможно выполнить инициализацию адаптера после фильтрации. Итак, как я могу добиться этого, сохраняя другие методы такими же и безопасными?Какие части я должен изменить?Заранее спасибо.

2019-03-13 02:23:56.374 27544-27544/com.demotxt.myapp.myapplication E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.demotxt.myapp.myapplication, PID: 27544
java.lang.NullPointerException: Attempt to invoke virtual method 'android.widget.Filter com.demotxt.myapp.myapplication.adapters.RecyclerViewLiveAdapter.getFilter()' on a null object reference
    at com.demotxt.myapp.myapplication.activities.Main3Activity$3.onQueryTextChange(Main3Activity.java:138)
    at android.support.v7.widget.SearchView.onTextChanged(SearchView.java:1180)
    at android.support.v7.widget.SearchView$10.onTextChanged(SearchView.java:1714)
    at android.widget.TextView.sendOnTextChanged(TextView.java:9413)
    at android.widget.TextView.setText(TextView.java:5086)
    at android.widget.TextView.setText(TextView.java:4908)
    at android.widget.EditText.setText(EditText.java:110)
    at android.widget.TextView.setText(TextView.java:4883)
    at android.support.v7.widget.SearchView.onActionViewExpanded(SearchView.java:1294)
    at android.support.v7.widget.Toolbar$ExpandedActionViewMenuPresenter.expandItemActionView(Toolbar.java:2396)
    at android.support.v7.view.menu.MenuBuilder.expandItemActionView(MenuBuilder.java:1348)
    at android.support.v7.view.menu.MenuItemImpl.expandActionView(MenuItemImpl.java:810)
    at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:978)
    at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:963)
    at android.support.v7.widget.ActionMenuView.invokeItem(ActionMenuView.java:624)
    at android.support.v7.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:150)
    at android.view.View.performClick(View.java:6205)
    at android.widget.TextView.performClick(TextView.java:11103)
    at android.view.View$PerformClick.run(View.java:23653)
    at android.os.Handler.handleCallback(Handler.java:751)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6682)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)

1 Ответ

0 голосов
/ 13 марта 2019

Вы имеете в виду объект нулевого адаптера. Не нужно снова создавать экземпляр для адаптера в методе setuprecyclerview (), поскольку вы уже создали для него глобальную ссылочную переменную. Вместо этого сделайте, как показано ниже,

 private void setuprecyclerview(List<Anime> lstAnime) {
    adapter = new RecyclerViewLiveAdapter(this,lstAnime) ;
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    recyclerView.setAdapter(adapter);
}

Кроме того, вы должны проверить, что этот объект адаптера не является нулевым в методе onQueryTextChange ().

if (adapter != null){
     adapter.getFilter().filter(newText);
}
...