0

Currently I'm using RecyclerView from Android to show some data that I get from Firebase. I'm using MVC design pattern so I had to pass some data from the view (actViewDB), to the controller(Controller) and then to the Model class (DataModel). Unfortunately I always get the Java NullPointerException error like this :

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.ryzen.pajakcerdas, PID: 5559
    java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window$Callback android.view.Window.getCallback()' on a null object reference
        at android.support.v7.app.AppCompatDelegateImplBase.<init>(AppCompatDelegateImplBase.java:117)
        at android.support.v7.app.AppCompatDelegateImplV9.<init>(AppCompatDelegateImplV9.java:149)
        at android.support.v7.app.AppCompatDelegateImplV11.<init>(AppCompatDelegateImplV11.java:29)
        at android.support.v7.app.AppCompatDelegateImplV14.<init>(AppCompatDelegateImplV14.java:54)
        at android.support.v7.app.AppCompatDelegateImplV23.<init>(AppCompatDelegateImplV23.java:31)
        at android.support.v7.app.AppCompatDelegateImplN.<init>(AppCompatDelegateImplN.java:31)
        at android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:198)
        at android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:183)
        at android.support.v7.app.AppCompatActivity.getDelegate(AppCompatActivity.java:519)
        at android.support.v7.app.AppCompatActivity.findViewById(AppCompatActivity.java:190)
        at com.example.ryzen.pajakcerdas.actViewDB.showDatabase(actViewDB.java:23)

My thought is the code can't Initialize the RecyclerView if executed from different class like implementing MVC architecture. here's the code:

actViewDB.java

public class actViewDB extends AppCompatActivity {

    private List<DataModel> modelList;
    private RecyclerView rc;
    private dataAdapter adapter;

    private actViewDB mMainActivity;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.recycle_viewdatabase);

        Controller.getData();
    }

    public void showDatabase(List<DataModel> mUsername){

        modelList = new ArrayList<>();
        this.modelList = mUsername;
        Log.d("ISI_SHOWDB", "" + modelList.toString());

        this.rc = findViewById(R.id.recycler_view);
        rc.setLayoutManager(new LinearLayoutManager(this));
        rc.setHasFixedSize(true);

        adapter = new dataAdapter();
        adapter.setNotes(modelList);
        rc.setAdapter(adapter);
    }
}

Controller.java

public class Controller {
    public static void getData(){
        DataModel.getData();
    }

    public static void ifSuccess(List<DataModel> mUsername){
        final actViewDB avd = new actViewDB();
        avd.showDatabase(mUsername);
    }
}

DataModel.java

public class DataModel {
    public static void getData() {
        FirebaseDatabase database = FirebaseDatabase.getInstance();
        DatabaseReference myRef = database.getReference("dataObjek");
        List<DataModel> mUsername = new ArrayList<>();

        myRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                mUsername.clear();
                for(DataSnapshot ds : dataSnapshot.getChildren()) {
                    String alamat = ds.child("alamat").getValue(String.class);
                    long harga = (long) ds.child("harga").getValue();
                    long njkp = (long) ds.child("njkp").getValue();
                    Integer pbb = ds.child("pbb").getValue(Integer.class);
                    Log.d("TAG", alamat + " / " + harga);
                    mUsername.add(new DataModel(alamat, harga, njkp, pbb));

                    Controller.ifSuccess(mUsername);
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                Controller.ifFail();
            }
        });
    }
}

recycle_viewdatabase.xml

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:tools="http://schemas.android.com/tools">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:listitem = "@layout/card_viewdatabase"/>

</android.support.design.widget.CoordinatorLayout>

This question is an updated question from my first question at Recycle View doesn't show data from adapter Maybe this is an ordinary question about NullPointerException but this question is about implementing MVC on Android, so i'm sorry if this question have already asked.

1 Answers1

0

After a lot of work I found the error in this line

final actViewDB avd = new actViewDB();

You are re creating activity in wrong way and onCreate method did not called so you have N P exception.

What you have to do :

in onCreate :

@Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.recycle_viewdatabase);
        Controller controller = new Controller(this);
        controller.getData();
    }

in Controller

 public class Controller {
      actViewDB activity;
     public  void Controller(actViewDB activity){
            this.activity = activity;
        }
        public static void getData(){
            DataModel.getData();
        }

        public static void ifSuccess(List<DataModel> mUsername){

            activity.showDatabase(mUsername);
        }
    }

Note1: you use MVP instead of MVC in Android

Note2: don't use a lot of static method it will make lake in memory

Note3: use Camel Case naming convention

halfer
  • 19,824
  • 17
  • 99
  • 186
Mohammad Sommakia
  • 1,773
  • 3
  • 15
  • 48