gpt4 book ai didi

java - 如何从另一个类及其上下文调用函数(android,java)

转载 作者:行者123 更新时间:2023-12-02 10:13:03 25 4
gpt4 key购买 nike

每当用户从 viewPager 中按下 Item 内的按钮时,我都会尝试重新加载 viewPager。本例的相关类是 SetupActivityAdapter。在 Activity 类中,我已经创建了两个函数来重新加载 viewPager:

public void deleteSession(String title) {
dbHelper = new DatabaseHelper(this);
((DatabaseHelper) dbHelper).deleteRow(title);
}

public void refreshAdapter () {

dbHelper = new DatabaseHelper(this);
Cursor dataCursor = ((DatabaseHelper) dbHelper).getData();
models = new ArrayList<>();

while (dataCursor.moveToNext()) {
models.add(new Model(
dataCursor.getString(1),
dataCursor.getInt(2),
dataCursor.getInt(3),
dataCursor.getInt(4)
));
}
adapter = new Adapter(models, this);
viewPager.setAdapter(adapter);
viewPager.setCurrentItem(0, true);
}

基本上,deleteSession() 从数据库中删除特定项目。 refreshAdapter() 从数据库中读取更新的数据,并为 viewPager 设置一个新的适配器。如果我从 SetupActivity 类中的 OnClick 事件调用这些函数,它们就可以正常工作。但是,如果我尝试从 Adapter 类中的 OnClick 事件调用它们,应用程序会崩溃并出现以下错误:

java.lang.NullPointerException: Attempt to invoke virtual method 'java.io.File android.content.Context.getDatabasePath(java.lang.String)' on a null object reference
at android.content.ContextWrapper.getDatabasePath(ContextWrapper.java:327)
at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:352)
at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:322)
at com.example.android.slink.DatabaseHelper.getData(DatabaseHelper.java:69)
at com.example.android.slink.SetupActivity.refreshAdapter(SetupActivity.java:436)
at com.example.android.slink.Adapter$3.onClick(Adapter.java:111)
at android.view.View.performClick(View.java:6669)
at android.view.View.performClickInternal(View.java:6638)
at android.view.View.access$3100(View.java:789)
at android.view.View$PerformClick.run(View.java:26145)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6863)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:537)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

这是我的 SetupActiviy 类(简化为相关部分):

package com.example.android.slink;

public class SetupActivity extends AppCompatActivity {

private SQLiteOpenHelper dbHelper;
private SQLiteDatabase database;

ViewPager viewPager;
Adapter adapter;
static ArrayList<Model> models;

public void deleteSession(String title) {
dbHelper = new DatabaseHelper(this);
((DatabaseHelper) dbHelper).deleteRow(title);
}

public void refreshAdapter () {
dbHelper = new DatabaseHelper(this);
Cursor dataCursor = ((DatabaseHelper) dbHelper).getData();
models = new ArrayList<>();
models.add(new Model("", 0,0,0));
while (dataCursor.moveToNext()) {
models.add(new Model(
dataCursor.getString(1),
dataCursor.getInt(2),
dataCursor.getInt(3),
dataCursor.getInt(4)
));
}
adapter = new Adapter(models, this);
viewPager.setAdapter(adapter);
viewPager.setCurrentItem(0, true);
}

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

editTextScreenTitle = findViewById(R.id.editTextScreenTitle);
relativeLayoutCard = findViewById(R.id.relativeLayoutCard);
viewPager = findViewById(R.id.viewPager);

dbHelper = new DatabaseHelper(this);
Cursor dataCursor = ((DatabaseHelper) dbHelper).getData();

models = new ArrayList<>();
models.add(new Model("", 0,0,0));
while (dataCursor.moveToNext()) {
models.add(new Model(
dataCursor.getString(1),
dataCursor.getInt(2),
dataCursor.getInt(3),
dataCursor.getInt(4)
));
}
adapter = new Adapter(models, this);
viewPager.setAdapter(adapter);
}
}

这是我的 Adapter 类(也简化为相关部分):

package com.example.android.slink;

public class Adapter extends PagerAdapter {

private List<Model> models;
private LayoutInflater layoutInflater;
private Context context;

SetupActivity setupActivity = new SetupActivity();

public Adapter(List<Model> models, Context context) {
this.models = models;
this.context = context;
}

@NonNull
@Override
public Object instantiateItem(@NonNull final ViewGroup container, final int position) {
layoutInflater = LayoutInflater.from(context);
final View view = layoutInflater.inflate(R.layout.item, container, false);

TextView buttonDeleteCard = view.findViewById(R.id.textViewDeleteCard);

buttonDeleteCard.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
setupActivity.deleteSession([...some title...]);
setupActivity.refreshAdapter();
}
});

container.addView(view, 0);
return view;
}
}

我认为这与上下文有关。我是否必须将上下文从 SetupActiity 传递到 Adapter 类,如果是这样,我该怎么做?或者这是不可能的,我需要从 SetupActivity 类中捕获 Adapter 类中的 OnClick 事件?我是java编程新手,如果你们能帮助我解决这个问题,我将非常感激!

最佳答案

像这样更改您的适配器:

public class Adapter extends PagerAdapter {

private List<Model> models;
private LayoutInflater layoutInflater;
private Context context;

private SetupActivity setupActivity;

public Adapter(List<Model> models, Context context) {
this.models = models;
this.context = context;
setupActivity = (SetupActivity) context;
}

@NonNull
@Override
public Object instantiateItem(@NonNull final ViewGroup container, final int position) {
layoutInflater = LayoutInflater.from(context);
final View view = layoutInflater.inflate(R.layout.item, container, false);

TextView buttonDeleteCard = view.findViewById(R.id.textViewDeleteCard);

buttonDeleteCard.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
setupActivity.deleteSession([...some title...]);
setupActivity.refreshAdapter();
}
});

container.addView(view, 0);
return view;
}
}

为什么会出现错误?

您将 ContextSetupActivity 传递到您的 Adapter,将该引用保存在字段中 (context )但您错误地创建了 SetupActivity 的新实例。

这就是您收到NullPointerException的原因。该 Activity 是您的上下文。它继承自它。因此,只需将其转换到构造函数中并稍后使用即可。

关于java - 如何从另一个类及其上下文调用函数(android,java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54856707/

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