我才刚刚开始学习Android,因此,如果我不解释自己想做的很好的话,我深表歉意。
因此,在我的预置列表活动中,我有一个预置对象的数组列表,并使用来自sqlite数据库的值填充该数组列表,该数据库在相应的DBHelper中创建和定义。我有一个使用自定义视图(textView和imageButton)的presetadapter。我将imageButtons设置为删除图标,当单击该按钮时,从数据库中删除相应的textview,使用更新后的值重新填充arraylist,然后对其进行更新,以显示该值的删除。
我能够从数据库中正确删除该值,并且为了重新填充并刷新arraylist和presetadapter,我在presetList中创建了一个称为refreshList()的方法。此方法应该处理该功能,但是当我调用它时,它将引发NullPointerException。更具体地说,当我尝试打开游标以从数据库中读取值时,它崩溃了:
错误:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.dmapp,PID: 5697
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.dmapp.presetsDBHelper.getSpecificPresets(presetsDBHelper.java:93)
at com.example.dmapp.PresetList.refreshList(PresetList.java:77)
at com.example.dmapp.Presetadapter$2.onClick(Presetadapter.java:72)
这是PresetList:
public class PresetList extends AppCompatactivity {
MyRecyclerViewAdapter adapter;
private Presetadapter presetadapter;
private ArrayList<Preset> presetList = new ArrayList<>();
String TAG = "PresetList";
private String passedPresetVariable;
private presetsDBHelper mPresetsDBHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.preset_list);
setPassedPresetVariable(this.getIntent().getStringExtra("presetVariable"));
Log.d(TAG,"onCreate: Passed Preset variable is " + getPassedPresetVariable());
// data to populate the RecyclerView with
mPresetsDBHelper = new presetsDBHelper(this);
DisplayMetrics displayMetrics = this.getResources().getDisplayMetrics();
int deviceHeight = (displayMetrics.heightPixels);
Button addEntry = findViewById(R.id.addEntry);
ListView presetListView = findViewById(R.id.presetListView);
ViewGroup.LayoutParams params = presetListView.getLayoutParams();
params.height = (int)(deviceHeight * .80);
presetListView.setLayoutParams(params);
// set up the RecyclerView with data from the database
//Log.d(TAG,"onCreate: Preset variable is " + getIntent().getStringExtra("presetVariable"));
Cursor presets = mPresetsDBHelper.getSpecificPresets(getIntent().getStringExtra("presetVariable"));
try {
if (presets.moveToNext()) {
do {
presetList.add(new Preset(presets.getString(2)));
} while (presets.moveToNext());
}
} finally {
presets.close();
}
presetadapter = new Presetadapter(this,presetList);
presetListView.setadapter(presetadapter);
/*
addEntry.setOnClicklistener(new View.OnClicklistener() {
// The code in this method will be executed when the numbers View is clicked on.
@Override
public void onClick(View view) {
Intent intent = new Intent(view.getcontext(),CityInfo.class);
startactivity(intent);
}
});
*/
}
public void refreshList(){
mPresetsDBHelper = new presetsDBHelper(this);
Log.d(TAG,"refreshList: Preset variable is " + getPassedPresetVariable());
presetList.clear();
Cursor presets = mPresetsDBHelper.getSpecificPresets("Environment"); //Didn't work with getPassedPresetVariable,attempted hardcoded value to test. Still not functional
try {
if (presets.moveToNext()) {
do {
presetList.add(new Preset(presets.getString(2)));
} while (presets.moveToNext());
}
} finally {
presets.close();
}
presetadapter.notifyDataSetChanged();
}
public void setPassedPresetVariable(String passedPresetVariable) {
this.passedPresetVariable = passedPresetVariable;
}
public String getPassedPresetVariable() {
return passedPresetVariable;
}
}
这是我的适配器:
public class Presetadapter extends ArrayAdapter<Preset> {
private Context mContext;
private List<Preset> presetList = new ArrayList<>();
private PresetList presetListClass;
String TAG = "Presetadapter";
public Presetadapter(Context context,ArrayList<Preset> list) {
super(context,list);
mContext = context;
presetList = list;
}
@NonNull
@Override
public View getView(int position,View convertView,ViewGroup parent) {
View listItem = convertView;
if(listItem == null) {
listItem = LayoutInflater.from(mContext).inflate(R.layout.preset_item,parent,false);
}
Preset currentPreset = presetList.get(position);
final TextView name = listItem.findViewById(R.id.presetvalue);
ImageButton delete = listItem.findViewById(R.id.deleteIcon);
name.setText(currentPreset.getvalue());
name.setTag(position);
name.setOnClicklistener(new View.OnClicklistener(){
@Override
public void onClick(View view) {
int position = (Integer) view.getTag();
// access the row position here to get the correct data item
Preset preset = getItem(position);
// Do what you want here...
String presetvalue = preset.getvalue();
Intent intent = new Intent(name.getcontext(),CityInfo.class);
intent.putExtra("presetvalue",presetvalue);
mContext.startactivity(intent);
}
});
delete.setTag(position);
delete.setOnClicklistener(new View.OnClicklistener(){
@Override
public void onClick(View view) {
int position = (Integer) view.getTag();
// access the row position here to get the correct data item
Preset preset = getItem(position);
// Do what you want here...
String presetvalue = preset.getvalue();
presetsDBHelper mPresetsDBHelper = new presetsDBHelper(name.getcontext());
mPresetsDBHelper.removeSpecificPreset(presetvalue);
presetListClass = new PresetList();
presetListClass.refreshList();
}
});
return listItem;
}
}
我认为有一种更简单的方法可以解决我所缺少的问题,或者有一些更简单的解决方案。如果有人可以给我一些见识,将不胜感激!