Инициализируйте RecyclerView с помощью контроллера / MVC - PullRequest
0 голосов
/ 14 июня 2019

В настоящее время я использую RecyclerView из Android, чтобы показать некоторые данные, полученные из Firebase. Я использую шаблон проектирования MVC, поэтому мне пришлось передать некоторые данные из представления (actViewDB), в контроллер (Controller), а затем в класс Model (DataModel). К сожалению, я всегда получаю ошибку Java NullPointerException, например:

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)

Я думаю, что код не может инициализировать RecyclerView, если он выполняется из другого класса, как, например, реализация архитектуры MVC. вот код:

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>

Этот вопрос является обновленным вопросом из моего первого вопроса на Просмотр корзины не показывает данные с адаптера Может быть, это обычный вопрос о NullPointerException, но этот вопрос касается реализации MVC на Android, поэтому извините, если этот вопрос уже задавался.

1 Ответ

0 голосов
/ 14 июня 2019

После большой работы я обнаружил ошибку в этой строке

final actViewDB avd = new actViewDB();

Вы неправильно создаете деятельность, и метод onCreate не вызван, поэтому у вас возникла исключительная ситуация NP.

Что нужно сделать:

в onCreate:

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

в 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);
        }
    }

Примечание 1: вы используете MVP вместо MVC в Android

Примечание2: не используйте много статических методов, это сделает озеро в памяти

Примечание 3: использовать соглашение о присвоении имен в Camel Case

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...