12

I am a little confused. I've set up a RecyclerView as per the tutorial on google/android site and I get the following error:

 Inner classes cannot have static declaration

Of course, I do have a nested static class but this is how android/google defined it.

  public class ItemsViewAdapter extends RecyclerView.Adapter<ItemsViewAdapter.ViewHolder> {
       // ... 
       // ...
       public static class ViewHolder extends RecyclerView.ViewHolder {
           // ...
       }

Why am I getting this error? I hear its better to use static for nested classes so you are not wasting a reference, but the current version of android studio is complaining

Any ideas?

byxor
  • 5,930
  • 4
  • 27
  • 44
Martin
  • 23,844
  • 55
  • 201
  • 327
  • It's most likely a bug. This question is similar to yours. http://stackoverflow.com/questions/10567906/cannot-declare-viewholder-as-static-inner-class?rq=1 – LonelyIdiot Aug 12 '15 at 06:30

2 Answers2

17

Straight to your questions:

  1. Inner classes cannot have static declaration

    That's completely true. This is not a bug, and the error message is not even misleading.

  2. I hear its better to use nested class as a static so you are not wasting a reference

    You are absolutely correct.

  3. Solution for you:

    Create a new class(File) in your project for ItemsViewAdapter and there won't be such an error.


General Discussion

Java and Android both supports that you can declare static inner classes/members/functions, BUT that class should be a parent class. You cannot do that inside an inner class.

I.e., class Main can have static class Adapter but if the Adapter class is an inner class of Main is not static then it can't have its own static inner class/member.

What You Can Have?

class Main 
    static class Adapter
        static class Holder

Or

class Adapter
    static class Holder

If you want to declare any member of class as static then the immediate parent class must be the top-level, main class in that file.

Why?

Quoting another answer, It's because an inner class is implicitly associated with an instance of its outer class, it cannot define any static methods itself. Since a static nested class cannot refer directly to instance variables or methods defined in its enclosing class, it can use them only through an object reference, it's safe to declare static methods in a static nested class.

Further Reading on the Topic

1 http://www.geeksforgeeks.org/inner-class-java/

2 http://www.javaworld.com/article/2077372/learn-java/static-class-declarations.html

3 http://viralpatel.net/blogs/inner-classes-in-java/

Community
  • 1
  • 1
MKJParekh
  • 34,073
  • 11
  • 87
  • 98
0

You could also simply implement ItemViewAdapter as a static class

public static class ItemsViewAdapter extends RecyclerView.Adapter<ItemsViewAdapter.ViewHolder> {
    ... 
    ...
   public static class ViewHolder extends RecyclerView.ViewHolder {
       ...
   }

That should take care of the error