Ссылка на нулевой объект в RecycleView

ora спросил: 28 марта 2018 в 04:35 в: java

Я пытаюсь реализовать фильтр поиска для своего приложения, но я не знаю, как это сделать. Я видел вопрос здесь здесь , но это только меня больше confused.This это то, что я сделал так далеко: я называю класс фрагментов в моем основном действии, как это

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);    }

Full 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 ответа

Alex Mamo ответил: 30 марта 2018 в 04:51

Это неправильный способ вызова действия из метода, существующего в классе фрагмента. Вам нужно использовать FragmentManager следующим образом:

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);
        }
    }
}
ora ответил: 30 марта 2018 в 04:57
Мне нужно вставить это внутри моего ..onCreateOptionsMenu
Alex Mamo ответил: 30 марта 2018 в 04:58
Именно так. Просто сделай это.
ora ответил: 30 марта 2018 в 05:01
теперь не вылетает, но ничего не отображается, я нажимаю на значок поиска и ничего не происходит
Alex Mamo ответил: 30 марта 2018 в 05:04
Попробуйте добавить запись в журнал, чтобы увидеть, вызывается ли метод. Если он вызывается, это означает, что проблема внутри вашего метода. Попробуйте также войти в fragmentTag, чтобы увидеть, заканчивается ли соответствующий тег вашей JobsFragment на 0. Так как это первый добавленный фрагмент.
Alex Mamo ответил: 30 марта 2018 в 05:47
Есть поток. Копирование и вставка не достаточно. Вам необходимо сделать это: найти фрагмент, создать новый адаптер, для каждого нового символа набирается в окне поиска. Если вы решите использовать Firestore, я рекомендую вам увидеть этот пост . Тот же принцип также применяется, даже если вы не используете Firestore и Algolia.
William Burnham ответил: 28 марта 2018 в 04:47

Вы получаете нулевую ссылку на объект, потому что вы не инициализируете элемент recycle ни с помощью прямого создания экземпляра в вашем фрагменте, ни с помощью внедрения (как указано в примере, который вы связали).

В приведенном вами примере

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

должен входить в ваш класс фрагмента.

В противном случае вам придется инициализировать его, надувая.

ora ответил: 28 марта 2018 в 04:50
Моя корзина во фрагменте отображается правильно, когда я помещаю строку и нажимаю кнопку поиска, приложение вылетает в этой строке jobsFragment.jobView(querySearch);, а затем появляется нулевой объект. Как мне это исправить?
William Burnham ответил: 28 марта 2018 в 04:52
Можете ли вы опубликовать трассировку стека как часть вашего вопроса?
ora ответил: 28 марта 2018 в 04:55
да уже сделано
William Burnham ответил: 28 марта 2018 в 05:01
когда вы отлаживаете, jobsFragment равно NULL?
ora ответил: 28 марта 2018 в 05:04
private JobsFragment jobsFragment=new JobsFragment(); это то, как я называю фрагмент внутри класса, который содержит этот фрагмент
Dennis K ответил: 30 марта 2018 в 05:08

Вы делаете это:

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

Фрагмент, отображаемый в пейджере, не тот, который вы держите в действии. Тот, который вы создали как

private JobsFragment jobsFragment=new JobsFragment();

На самом деле никогда не создавался (то есть onCreate никогда не вызывался, он не привязан к действию).

Как прямой исправить, заменить на

adapter.addFragment(jobsFragment, "Jobs");

Но я бы посоветовал переосмыслить архитектуру приложения.

ora ответил: 30 марта 2018 в 05:18
Эй, Деннис, ты можешь помочь мне с моим новым вопросом?
Dennis K ответил: 30 марта 2018 в 05:25
Какой новый вопрос?
ora ответил: 30 марта 2018 в 05:26
stackoverflow.com/questions/49987736/…
Dennis K ответил: 30 марта 2018 в 05:28
Я посмотрю на это. Но вы можете принять это, если это решило вашу проблему.
ora ответил: 30 марта 2018 в 05:30
Деннис не этот, у меня больше 4 часов с Алексом, пытающимся решить это, я бы принял это, как и на все мои вопросы