RecycleView中的空对象引用

我正在尝试为我的应用程序实现搜索filter,但我不知道该怎么做。我在这里看到了一个问题,但这只会让我更加困惑。这就是我迄今为止所做的:我称之为片段我这样的主要活动中的课程

private JobsFragment jobsFragment=new JobsFragment(); 

主要活动

 public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_main, menu); final SearchView searchView=(SearchView) menu.findItem(R.id.action_search).getActionView(); SearchManager searchManager = (SearchManager) getSystemService(SEARCH_SERVICE); searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String text) { Query querySearch = fb.collection("jobs").whereEqualTo("title", text); if (!text.trim().isEmpty()){ jobsFragment.jobView(querySearch); } return false; } @Override public boolean onQueryTextChange(String newText) { if (newText.trim().isEmpty()){ } return false; } }); return true; } 

RecycleView位于JobsFragment中:

 public void jobView(Query query){ recycle.setItemAnimator(new DefaultItemAnimator()); FirestoreRecyclerOptions options = new FirestoreRecyclerOptions.Builder() .setQuery(query, JobsLists.class) .build(); adapter = new FirestoreRecyclerAdapter(options) { @Override protected void onBindViewHolder(@NonNull final JobsViewHolder holder, final int position, @NonNull final JobsLists jobsmodel) { holder.setTitle(jobsmodel.getTitle()); holder.setDate(jobsmodel.getDate()); holder.setCo_Name(jobsmodel.getCo_Name()); holder.setSkills(jobsmodel.getSkills()); holder.setLocation(jobsmodel.getLocation()); holder.view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Context context = v.getContext(); Intent intent = new Intent(context, JobView.class); intent.putExtra("title", jobsmodel.getTitle()); intent.putExtra("skills", jobsmodel.getSkills()); intent.putExtra("company", jobsmodel.getCo_Name()); intent.putExtra("description", jobsmodel.getDescription()); context.startActivity(intent); } }); } @NonNull @Override public JobsViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.custom_card, parent, false); return new JobsViewHolder(view); } @Override public int getItemViewType(int position) { return position; } }; recycle.setAdapter(adapter); } 

完整StackTrace

 java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView.setItemAnimator (android.support.v7.widget.RecyclerView$ItemAnimator)' on a null object reference at com.example.dell.ora.JobsFragment.jobView(JobsFragment.java:57) at com.example.dell.ora.Maino$2.onQueryTextSubmit(Maino.java:71) at android.support.v7.widget.SearchView.onSubmitQuery(SearchView.java:1189) at android.support.v7.widget.SearchView$7.onEditorAction(SearchView.java:1166) at android.widget.TextView.onEditorAction(TextView.java:5207) 

这不是您从活动中调用片段类中存在的方法的正确方法。 您需要像这样使用FragmentManager

 FragmentManager fragmentManager = getSupportFragmentManager(); List fragments = getSupportFragmentManager().getFragments(); for (Fragment fragment : fragments) { String fragmentTag = fragment.getTag(); if (fragmentTag != null) { String lastCharacter = fragmentTag.substring(fragmentTag.length() - 1); if (lastCharacter.equals("0")) { JobsFragment jobsFragment = (JobsFragment) fragmentManager.findFragmentByTag(fragmentTag); jobsFragment.jobView(querySearch); } } } 

您得到一个空对象引用,因为您没有初始化recycle成员,无论是在片段中直接实例化还是使用注入(在您链接的示例中注释)。

从您链接的示例中,

 @BindView(R.id.yourViewId) RecyclerView recycle; 

应该进入你的片段类。

否则你将不得不通过膨胀来初始化它。

你这样做:

 adapter.addFragment(new JobsFragment(), "Jobs"); 

寻呼机中显示的片段不是您在“活动”中保留的片段。 你实例化的那个

 private JobsFragment jobsFragment=new JobsFragment(); 

实际上从来没有被创建过(即onCreate从未被调用过,它没有附加到活动上)。

作为直接修复,替换为

 adapter.addFragment(jobsFragment, "Jobs"); 

但我建议重新考虑应用程序的架构。