试图调用虚拟方法:错误java.lang.NullPointerException

问题描述 投票:0回答:1

我在logcat中收到以下错误

java.lang.NullPointerException: Attempt to invoke virtual method 'void androidx.recyclerview.widget.RecyclerView.setLayoutManager(androidx.recyclerview.widget.RecyclerView$LayoutManager)' on a null object reference
        at com.example.bookitup.RecyclerView_Config.setConfig(RecyclerView_Config.java:21)
        at com.example.bookitup.MainActivity$2.DataIsLoaded(MainActivity.java:74)
        at com.example.bookitup.BookDatabaseEdit$1.onDataChange(BookDatabaseEdit.java:40)
        at com.google.firebase.database.core.ValueEventRegistration.fireEvent(com.google.firebase:firebase-database@@19.2.1:75)
        at com.google.firebase.database.core.view.DataEvent.fire(com.google.firebase:firebase-database@@19.2.1:63)
        at com.google.firebase.database.core.view.EventRaiser$1.run(com.google.firebase:firebase-database@@19.2.1:55)
        at android.os.Handler.handleCallback(Handler.java:883)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7356)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)

这是导致此NPE的我的代码。

public class RecyclerView_Config {
    private Context mContext;
    private BooksAdapter mBooksAdapter;
    public void setConfig(RecyclerView recyclerView, Context context, List<BookActivity> books, List<String> keys){
        mContext=context;
        mBooksAdapter=new BooksAdapter(books,keys);
        recyclerView.setLayoutManager(new LinearLayoutManager(context));/*here!!!!!!!!!!!!!!!!!!!!!!!!!*/
        recyclerView.setAdapter(mBooksAdapter);
    }

    class BookItemView extends RecyclerView.ViewHolder {
        private TextView mTitle;
        private TextView mAuthor;
        private TextView mISBN;
        private TextView mCategory;

        private String key;
        public BookItemView(ViewGroup parent){
            super(LayoutInflater.from(mContext).inflate(R.layout.book_list_item,parent,false));
            mTitle = (TextView) itemView.findViewById(R.id.title_txtView);
            mAuthor = (TextView) itemView.findViewById(R.id.author_txtView);
            mCategory = (TextView) itemView.findViewById(R.id.category_txtView);
            mISBN = (TextView) itemView.findViewById(R.id.isbn_txtView);

        }
        public void bind(BookActivity book, String key){
            mTitle.setText(book.getXbook());
            mAuthor.setText(book.getXauthor());
            mCategory.setText(book.getXdescription());
            mISBN.setText(book.getXisbn());
            this.key=key;
        }
    }
    class BooksAdapter extends RecyclerView.Adapter<BookItemView>{
        private List<BookActivity> mBookList;
        private List<String> mKeys;

        public BooksAdapter(List<BookActivity> mBookList, List<String> mKeys) {
            this.mBookList = mBookList;
            this.mKeys = mKeys;
        }

        @NonNull
        @Override
        public BookItemView onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            return new BookItemView((parent));
        }

        @Override
        public void onBindViewHolder(@NonNull BookItemView holder, int position) {
            holder.bind(mBookList.get(position), mKeys.get(position));
        }

        @Override
        public int getItemCount() {
            return mBookList.size();
        }
    }
}

这是我的活动中的代码

protected void onCreate(Bundle savedInstanceState) {
    setTheme(R.style.AppTheme_NoActionBar);

    super.onCreate(savedInstanceState);
    FirebaseUser user= FirebaseAuth.getInstance().getCurrentUser();

    if (user != null) {
        setContentView(R.layout.activity_main);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        FloatingActionButton fab = findViewById(R.id.fab);
        Toast.makeText(getApplicationContext(), "on the main page", Toast.LENGTH_LONG).show();
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
               //Snackbar.make(view, "Adding new book, please wait!", Snackbar.LENGTH_LONG).setAction("Action", null).show();
                Toast.makeText(getApplicationContext(), "Adding new book, please wait ", Toast.LENGTH_LONG).show();
                //progressBar.setVisibility(View.GONE);
                Intent intent = new Intent(MainActivity.this, AddBookActivity.class);
                startActivity(intent);
            }
        });
        DrawerLayout drawer = findViewById(R.id.drawer_layout);
        NavigationView navigationView = findViewById(R.id.nav_view);

        //piling all books on the main page
        mRecyclerView = (RecyclerView) findViewById(R.id.recyclerview_books);
        new BookDatabaseEdit().readBooks(new BookDatabaseEdit.DataStatus() {
            @Override
            public void DataIsLoaded(List<BookActivity> books, List<String> keys) {
                new RecyclerView_Config().setConfig(mRecyclerView,MainActivity.this,books,keys);/*here!!!!!!!!!!!!!!*/
            }

            @Override
            public void DataIsInserted() {

            }

            @Override
            public void DataIsUpdated() {

            }

            @Override
            public void DataIsDeleted() {

            }
        });

        // Passing each menu ID as a set of Ids because each
        // menu should be considered as top level destinations.
        mAppBarConfiguration = new AppBarConfiguration.Builder(
                R.id.nav_home, R.id.nav_gallery, R.id.nav_slideshow,
                R.id.nav_tools, R.id.nav_share, R.id.nav_send, R.id.nav_profile_edit)
                .setDrawerLayout(drawer)
                .build();
        NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
        NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
        NavigationUI.setupWithNavController(navigationView, navController);
    }
    else {
        Intent intent = new Intent(MainActivity.this, RegistrationActivity.class);
        startActivity(intent);
    }
}
java android firebase-realtime-database
1个回答
0
投票
mBooksAdapter = new BooksAdapter(books,keys); recyclerView.setLayoutManager(new LinearLayoutManager(context)); recyclerView.setAdapter(mBooksAdapter);
这需要放置在您的活动/片段的onCreateonCreateView功能中。

之后 setContentViewfindViewById

new RecyclerView_Config被调用时,它试图获取RecyclerView的视图引用,但找不到它,因此您正在获得NullPointerException

此外,setContentView调用应作为super函数中onCreate调用之后的第一条语句。

protected void onCreate(Bundle savedInstanceState) { setTheme(R.style.AppTheme_NoActionBar); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Rest of your code FirebaseUser user= FirebaseAuth.getInstance().getCurrentUser(); // .... }

© www.soinside.com 2019 - 2024. All rights reserved.