gpt4 book ai didi

java - 使用 Controller/MVC 初始化 RecyclerView

转载 作者:行者123 更新时间:2023-12-02 04:27:17 24 4
gpt4 key购买 nike

目前,我正在使用 Android 中的 RecyclerView 来显示从 Firebase 获取的一些数据。我正在使用 MVC 设计模式,因此我必须将一些数据从 View (actViewDB) 传递到 Controller (Controller),然后传递到模型类 (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)

我的想法是,如果从不同的类(例如实现 MVC 架构)执行,代码将无法初始化 RecyclerView。这是代码:

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>

这个问题是我的第一个问题的更新问题:Recycle View doesn't show data from adapter也许这是一个关于 NullPointerException 的普通问题,但这个问题是关于在 Android 上实现 MVC 的,所以如果这个问题已经问过,我很抱歉。

最佳答案

经过大量工作后,我发现了这一行的错误

final actViewDB avd = new actViewDB();

您正在以错误的方式重新创建 Activity ,并且 onCreate 方法未调用,因此您出现 N P 异常。

你必须做什么:

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:您在 Android 中使用 MVP 而不是 MVC

注意2:不要使用大量静态方法,否则会造成内存湖

注3:使用驼峰式命名约定

关于java - 使用 Controller/MVC 初始化 RecyclerView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56602950/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com