首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >getFilter()抛出空指针异常(可能是因为初始化适配器,无法解决它)

getFilter()抛出空指针异常(可能是因为初始化适配器,无法解决它)
EN

Stack Overflow用户
提问于 2019-03-13 07:36:57
回答 1查看 683关注 0票数 1

这一次我面临着另一个问题,我试图用RecyclerView中的搜索进行过滤,很可能是因为我不知道如何在保持其他方法正常的情况下初始化适配器,我已经做了研究,这是我在Main3Activity上的最终代码;

代码语言:javascript
复制
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;

}

}

和适配器中的过滤器部分;

代码语言:javascript
复制
   @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响应后,使用此代码初始化adapter.But,而不会更改任何内容。在过滤之后,不可能设置适配器

代码语言:javascript
复制
if (adapter == null){
            adapter.getFilter().filter(newText);}
            return false;

如果我将adapter == null更改为adapter != null搜索功能,键盘弹出,但它没有触发过滤器事件,整个回收器视图保持same.So当我保持它作为适配器==空它抛出一个NPE,如果你往下看你会看到我的适配器中的getFilter是空的,因为我不能使适配器在filtering.So之后初始化,我如何才能在保持其他方法相同和安全的同时实现这一点?我需要更改哪些部分?提前谢谢。

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-13 07:49:29

您引用的适配器对象为空。不需要在setuprecyclerview()方法中再次为适配器创建实例,因为您已经为它创建了一个全局引用变量。相反,请执行以下操作,

代码语言:javascript
复制
 private void setuprecyclerview(List<Anime> lstAnime) {
    adapter = new RecyclerViewLiveAdapter(this,lstAnime) ;
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    recyclerView.setAdapter(adapter);
}

另外,您应该在onQueryTextChange()方法中检查该适配器对象是否不为空。

代码语言:javascript
复制
if (adapter != null){
     adapter.getFilter().filter(newText);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55132241

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档