当前位置: 首页 > 知识库问答 >
问题:

回收视图中的空对象引用

唐兴思
2023-03-14

我试图为我的应用程序实现一个搜索过滤器,但我不知道如何去做。我在这里看到一个问题,但这只会让我更加困惑。这是我目前所做的:我在我的主活动中这样调用片段类

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<JobsLists> options = new FirestoreRecyclerOptions.Builder<JobsLists>()
                .setQuery(query, JobsLists.class)
                .build();
        adapter = new FirestoreRecyclerAdapter<JobsLists, JobsViewHolder>(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)

共有3个答案

汝才良
2023-03-14

你正在这样做:

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

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

private JobsFragment jobsFragment=new JobsFragment();

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

作为直接修复,请替换为

adapter.addFragment(jobsFragment, "Jobs");

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

戚修雅
2023-03-14

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

从您链接的示例来看,

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

应该去你的片段课。

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

应和悦
2023-03-14

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

FragmentManager fragmentManager = getSupportFragmentManager();

List<Fragment> 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);
        }
    }
}
 类似资料:
  • 我正在尝试在我的 上实现 ,但我没有得到任何结果。 我遵循了这个教程和这个技巧,但是没有人为我工作。 我已经实现了: 但它不让我编译,因为它们是不同的< code > viewmoder ,因为我创建了两个< code > viewmoder 类,但它们< code >扩展了Recycler。ViewHolder所以我不明白... 我正在尝试这样做,因为我有一个,我希望当列表为空时,它会显示一个,

  • 我能够从URL发送JSON响应,然后当我在RecyclerView上显示相同的响应时,得到的输出是空白的,但选项卡和导航抽屉仍然存在。运行该应用程序时也没有错误。我也在使用截击库。 问题:我在列出服务的RecylerView上没有得到任何输出。我会在这里贴出与RecyclerView相关的代码。另外,我已经在底部发布了堆栈跟踪。 serviceViewAdapter.java(适配器) fragm

  • 主要活动: 适配器:

  • 我正在尝试使用适配器运行我的应用程序,但在执行此操作时,我遇到了以下错误: ReviewActivity StandupPlayerMain.java

  • 我想从我的视图模型中添加一个对象到树视图,但我不想使用树视图项。 有没有办法做这样的事? 问题是我试图绑定到一个非同质数据结构 我不想要类a的节点 为类B添加了一个带有静态标题文本的TreeViewItem 为ClassC添加了一个TreeViewItem,其中包含静态标题文本,将ItemsSource绑定到ClassC,并将DisplayMemberPath绑定到Name属性 绑定另一个控件ro

  • 在其他回收器视图中有一个回收器视图。两者都需要垂直滚动。外部回收器视图滚动正常,但内部回收器视图滚动不正常。 这是代码: ViewAdapter如下: 我尝试了以下两种回收商观点,但都无法解决问题 也尝试了这个: