Я создаю приложение, которое отображает список заметок в программе recyclerView. Проблема в том, что я получаю следующую ошибку, когда запускаю свое приложение и пытаюсь ее исправить:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.schoolteacher, PID: 7550
java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
at com.example.schoolteacher.Adapter.NotesAdapter.getItemCount(NotesAdapter.java:55)
at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep1(RecyclerView.java:4044)
at androidx.recyclerview.widget.RecyclerView.dispatchLayout(RecyclerView.java:3849)
at androidx.recyclerview.widget.RecyclerView.onLayout(RecyclerView.java:4404)
at android.view.View.layout(View.java:20960)
at android.view.ViewGroup.layout(ViewGroup.java:6279)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:325)
at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
at android.view.View.layout(View.java:20960)
at android.view.ViewGroup.layout(ViewGroup.java:6279)
at androidx.constraintlayout.widget.ConstraintLayout.onLayout(ConstraintLayout.java:1915)
at android.view.View.layout(View.java:20960)
at android.view.ViewGroup.layout(ViewGroup.java:6279)
at androidx.drawerlayout.widget.DrawerLayout.onLayout(DrawerLayout.java:1231)
at android.view.View.layout(View.java:20960)
at android.view.ViewGroup.layout(ViewGroup.java:6279)
at androidx.drawerlayout.widget.DrawerLayout.onLayout(DrawerLayout.java:1231)
at android.view.View.layout(View.java:20960)
at android.view.ViewGroup.layout(ViewGroup.java:6279)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:325)
at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
at android.view.View.layout(View.java:20960)
at android.view.ViewGroup.layout(ViewGroup.java:6279)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1842)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1686)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1595)
at android.view.View.layout(View.java:20960)
at android.view.ViewGroup.layout(ViewGroup.java:6279)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:325)
at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
at android.view.View.layout(View.java:20960)
at android.view.ViewGroup.layout(ViewGroup.java:6279)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1842)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1686)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1595)
at android.view.View.layout(View.java:20960)
at android.view.ViewGroup.layout(ViewGroup.java:6279)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:325)
at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
at com.android.internal.policy.DecorView.onLayout(DecorView.java:926)
at android.view.View.layout(View.java:20960)
at android.view.ViewGroup.layout(ViewGroup.java:6279)
at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:3037)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2545)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1636)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7946)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1092)
at android.view.Choreographer.doCallbacks(Choreographer.java:893)
at android.view.Choreographer.doFrame(Choreographer.java:812)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1078)
at android.os.Handler.handleCallback(Handler.java:907)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:216)
at android.app.ActivityThread.main(ActivityThread.java:7625)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:987)
Вот мой код:
ClassActivity. java
public class ClassActivity extends AppCompatActivity {
// Firebase instance variables
private FirebaseAuth mFirebaseAuth;
private FirebaseUser mFirebaseUser;
//HomeScreen variables
RecyclerView recyclerView;
FirebaseDatabase firebaseDatabase;
DatabaseReference databaseReference;
List<Listdata> list =new ArrayList<>();
Context context;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_class);
FloatingActionButton fab = findViewById(R.id.fab);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
View decorView = getWindow().getDecorView();
decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
BottomNavigationView bottomNav = findViewById(R.id.bottom_navigation);
bottomNav.setSelectedItemId(R.id.bottomBarItemSecond);
bottomNav.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.bottomBarItemFirst:
startActivity(new Intent(getApplicationContext(), MainActivity.class));
overridePendingTransition(0,0);
break;
case R.id.bottomBarItemSecond:
break;
case R.id.bottomBarItemThird:
startActivity(new Intent(getApplicationContext(), MessageActivity.class));
overridePendingTransition(0,0);
break;
case R.id.bottomBarItemFourth:
break;
case R.id.bottomBarItemFifth:
break;
}
return true;
}
});
// Initialize Firebase Auth
mFirebaseAuth = FirebaseAuth.getInstance();
mFirebaseUser = mFirebaseAuth.getCurrentUser();
//Navigation drawer
new DrawerBuilder().withActivity(this).build();
//primary items
PrimaryDrawerItem profile = new PrimaryDrawerItem()
.withIdentifier(1)
.withName(R.string.drawer_item_name)
.withDescription("Edit Profile")
.withDescriptionTextColorRes(R.color.black_overlay)
.withIcon(R.drawable.ic_account_circle);
//secondary items
SecondaryDrawerItem calendar = (SecondaryDrawerItem) new SecondaryDrawerItem()
.withIdentifier(11)
.withName(R.string.drawer_item_calendar)
.withIcon(R.drawable.ic_calendar);
SecondaryDrawerItem attendance = (SecondaryDrawerItem) new SecondaryDrawerItem()
.withIdentifier(12)
.withName(R.string.drawer_item_attendance)
.withIcon(R.drawable.ic_attendance);
SecondaryDrawerItem whatsdue = (SecondaryDrawerItem) new SecondaryDrawerItem()
.withIdentifier(13)
.withName(R.string.drawer_item_due)
.withIcon(R.drawable.ic_assignment);
SecondaryDrawerItem grades = (SecondaryDrawerItem) new SecondaryDrawerItem()
.withIdentifier(14)
.withName(R.string.drawer_item_grades)
.withIcon(R.drawable.ic_grades);
SecondaryDrawerItem folders = (SecondaryDrawerItem) new SecondaryDrawerItem()
.withIdentifier(15)
.withName(R.string.drawer_item_folders)
.withIcon(R.drawable.ic_folder);
//settings, help, contact items
SecondaryDrawerItem settings = (SecondaryDrawerItem) new SecondaryDrawerItem()
.withIdentifier(97)
.withName(R.string.drawer_item_settings)
.withIcon(R.drawable.ic_settings);
SecondaryDrawerItem help = (SecondaryDrawerItem) new SecondaryDrawerItem()
.withIdentifier(98)
.withName(R.string.drawer_item_help)
.withIcon(R.drawable.ic_help);
SecondaryDrawerItem logout = (SecondaryDrawerItem) new SecondaryDrawerItem()
.withIdentifier(99)
.withName(R.string.drawer_item_logout)
.withIcon(R.drawable.ic_logout);
new DrawerBuilder()
.withActivity(this)
.withToolbar(toolbar)
.withActionBarDrawerToggleAnimated(true)
.withTranslucentStatusBar(false)
.withFullscreen(true)
.withSavedInstance(savedInstanceState)
.addDrawerItems(
profile,
new SectionDrawerItem(),
calendar,
attendance,
whatsdue,
grades,
folders,
new DividerDrawerItem(),
settings,
help,
logout
)
.withOnDrawerItemClickListener(new Drawer.OnDrawerItemClickListener() {
@Override
public boolean onItemClick(View view, int position, IDrawerItem drawerItem) {
if (drawerItem != null) {
Intent intent = null;
if (drawerItem.getIdentifier() == 1) {
intent = new Intent(ClassActivity.this, ProfileInfoActivity.class);
} else if (drawerItem.getIdentifier() == 2) {
//intent = new Intent(MainActivity.this, Class.class);
} else if (drawerItem.getIdentifier() == 3) {
//intent = new Intent(MainActivity.this, Class.class);
} else if (drawerItem.getIdentifier() == 11) {
//intent = new Intent(MainActivity.this, Class.class);
} else if (drawerItem.getIdentifier() == 12) {
//intent = new Intent(MainActivity.this, Class.class);
} else if (drawerItem.getIdentifier() == 13) {
//intent = new Intent(MainActivity.this, Class.class);
} else if (drawerItem.getIdentifier() == 97) {
intent = new Intent(ClassActivity.this, Settings.class);
} else if (drawerItem.getIdentifier() == 98) {
intent = new Intent(ClassActivity.this, Help.class);
} else if (drawerItem.getIdentifier() == 99) {
FirebaseAuth.getInstance().signOut();
sendToStart();
}
if (intent != null) {
ClassActivity.this.startActivity(intent);
}
}
return false;
}
})
.build();
//End of Navigation drawer
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startActivity(new Intent(getApplicationContext(), AddClassActivity.class));
}
});
recyclerView=findViewById(R.id.recyclerview);
recyclerView.setHasFixedSize(true);
RecyclerView.LayoutManager layoutManager=new LinearLayoutManager(ClassActivity.this);
recyclerView.setLayoutManager(layoutManager);
final NotesAdapter notesAdapter=new NotesAdapter(list,this);
recyclerView.setAdapter(notesAdapter);
firebaseDatabase=FirebaseDatabase.getInstance();
databaseReference=firebaseDatabase.getReference("Classes");
databaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for(DataSnapshot dataSnapshot1: dataSnapshot.getChildren())
{
Listdata listdata=dataSnapshot1.getValue(Listdata.class);
list.add(listdata);
}
notesAdapter.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
@Override
public void onStart() {
super.onStart();
FirebaseUser currentUser = mFirebaseAuth.getCurrentUser();
if(currentUser == null){
sendToStart();
}
}
private void sendToStart() {
Intent startIntent = new Intent(ClassActivity.this, LoginActivity.class);
startActivity(startIntent);
finish();
}
}
NotesAdapter
public class NotesAdapter extends RecyclerView.Adapter<NotesAdapter.MyHolder> {
private List<Listdata> noteslist;
private Context context;
public NotesAdapter(List<Listdata> noteslist, Context context)
{
this.context=context;
this.noteslist=noteslist;
}
public NotesAdapter(List<Listdata> list, ClassActivity context) {
}
@NonNull
@Override
public MyHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view= LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item,viewGroup,false);
MyHolder myHolder=new MyHolder(view);
return myHolder;
}
@Override
public void onBindViewHolder(@NonNull MyHolder myHolder, int position) {
Listdata data=noteslist.get(position);
myHolder.title.setText(data.getTitle());
myHolder.desc.setText(data.getDesc());
}
@Override
public int getItemCount() {
return noteslist.size();
}
class MyHolder extends RecyclerView.ViewHolder {
TextView title,desc,grade,subject;
MyHolder(@NonNull View itemView) {
super(itemView);
title=itemView.findViewById(R.id.title);
desc=itemView.findViewById(R.id.desc);
grade=itemView.findViewById(R.id.grade);
subject=itemView.findViewById(R.id.subject);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Listdata listdata=noteslist.get(getAdapterPosition());
Intent i=new Intent(context, EditActivity.class);
i.putExtra("id",listdata.id);
i.putExtra("title",listdata.title);
i.putExtra("desc",listdata.desc);
i.putExtra("grade",listdata.grade);
i.putExtra("subject",listdata.subject);
context.startActivity(i);
}
});
}
}
}
активность_класса. xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.schoolteacher.ClassActivity">
<com.google.android.material.appbar.AppBarLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
android:id="@+id/appBar"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="#FFFFFF"
app:title="@string/classes"
app:popupTheme="@style/AppTheme.PopupOverlay">
</androidx.appcompat.widget.Toolbar>
</com.google.android.material.appbar.AppBarLayout>
<FrameLayout
android:id="@+id/container"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toTopOf="@+id/bottom_navigation"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/appBar">
<include layout="@layout/content_home_screen" />
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_margin="@dimen/fab_margin"
android:theme="@style/Theme.AppCompat"
app:backgroundTint="@color/colorPrimary"
android:src="@drawable/ic_add_fab"/>
</FrameLayout>
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bottom_navigation"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="?android:attr/windowBackground"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:menu="@menu/bottombar_menu" />
</androidx.constraintlayout.widget.ConstraintLayout>
похоже, что есть проблема с getItemCount в классе NotesAdapter. но я сделал именно то, что написано в документации! Может ли кто-нибудь помочь, пожалуйста?