Адаптер в FirebaseUI обнуляется - PullRequest
0 голосов
/ 05 июля 2019

Я использовал Firebase Recycler Adapter для получения данных.Но всегда получаю ошибку,

Попытка вызвать виртуальный метод void androidx.recyclerview.widget.RecyclerView.setAdapter (androidx.recyclerview.widget.RecyclerView $ Adapter) 'для ссылки на нулевой объект

Мой фрагмент

public class MyBooksFragment extends BaseFragment {


    private ShimmerFrameLayout mShimmerViewContainer;
    private RecyclerView recyclerView ;
    private FirebaseRecyclerAdapter adapter;
    private FirebaseUser user= FirebaseAuth.getInstance().getCurrentUser();

    @Override
    public BaseFragment provideFragment() {

        return new MyBooksFragment();
    }

    @Override
    public View provideFragmentView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_my_books,parent,false);

        mShimmerViewContainer=view.findViewById(R.id.mybook_shimmer_view_container);

        RecyclerView recyclerView = view.findViewById(R.id.recycler_view_books);
        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));

        fetchBooks(1);


        FloatingActionButton fab = view.findViewById(R.id.addBookFab_);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getActivity(), BookAdder.class);
                startActivity(intent);
            }
        });

        return view;

    }


    private FirebaseRecyclerOptions<Book> queryBuilderParser(){
        Query bookQuery= FirebaseDatabase
                .getInstance()
                .getReference()
                .child("Books")
                .orderByChild("ownerID")
                .equalTo(user.getUid());

        FirebaseRecyclerOptions<Book> options =
                new FirebaseRecyclerOptions.Builder<Book>()
                        .setQuery(bookQuery,Book.class)
                        .build();
        return options;
    }


    protected void fetchBooks(int type)
    {
        Log.e("profile",type+" ");

        FirebaseRecyclerOptions<Book> options;

                Query bookQuery= FirebaseDatabase
                        .getInstance()
                        .getReference()
                        .child("Books")
                        .orderByChild("ownerID")
                        .equalTo(user.getUid());

                options = new FirebaseRecyclerOptions.Builder<Book>()
                        .setQuery(bookQuery,Book.class)
                        .build();



        Log.e("profile","inside fetchReviw "+options.getSnapshots());

        adapter= new FirebaseRecyclerAdapter<Book, BookViewHolder>(options) {
            @NonNull
            @Override
            public BookViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                View view = LayoutInflater.from(parent.getContext())
                        .inflate(R.layout.book_row_item, parent, false);

                return new BookViewHolder(view);
            }

            @Override
            protected void onBindViewHolder(@NonNull BookViewHolder bookViewHolder, int i, @NonNull Book book) {


                bookViewHolder.book_name.setText(book.getBookName());
                bookViewHolder.book_author.setText(book.getAuthors());
                bookViewHolder.book_category.setText(book.getCategory());
                bookViewHolder.book_rating.setText(book.getRating()+"");
                Glide.with(getActivity()).load(book.getThumbnail()).into(bookViewHolder.img_thumbnail);

            }

            @Override
            public void onDataChanged() {


                if(getItemCount()>0 && mShimmerViewContainer!=null){
                    mShimmerViewContainer.stopShimmerAnimation();
                    mShimmerViewContainer.setVisibility(View.GONE);
                }
            }



            @Override
            public void onError(DatabaseError e) {
                // Called when there is an error getting data. You may want to update
                // your UI to display an error message to the user.
                // ...
                Log.e("profile","database error");
            }



        };

        recyclerView.setAdapter(adapter);


    }


}

Здесь я расширил базовый фрагмент, который расширяет Фрагмент .

1 Ответ

0 голосов
/ 05 июля 2019

Вы не ввели правильные аргументы в адаптер. Адаптер принимает 4 аргумента в:

  • Класс объекта
  • Ресурс макета элемента списка
  • Класс видоискателя
  • Ссылка на запрос / базу данных

Вот как это должно выглядеть. Адаптер выполняет много сложных слов, поэтому вам нужно всего лишь использовать функцию populateViewHolder:

FirebaseRecyclerViewAdapter<Object, ObjectViewHolder> adapter = new FirebaseRecyclerViewAdapter<Object, ObjectViewHolder>
(Object.class, android.R.layout.*list_item_layout*, ObjectViewHolder.class, objectQuery) {
     public void populateViewHolder(ObjectViewHolder ObjectViewHolder, Object Object) {

        //in your case the following lines:
            bookViewHolder.book_name.setText(book.getBookName());
            bookViewHolder.book_author.setText(book.getAuthors());
            bookViewHolder.book_category.setText(book.getCategory());
            bookViewHolder.book_rating.setText(book.getRating()+"");
            Glide.with(getActivity()).load(book.getThumbnail()).into(bookViewHolder.img_thumbnail);

     }
 };

 recycler.setAdapter(mAdapter);
...