Je viens juste de commencer à apprendre Android, alors je m'excuse si je n'explique pas très bien ce que j'essaie de faire.
Donc, dans mon activité presetList, j'ai une liste de tableaux d'objets prédéfinis, et je remplis cette liste de tableaux avec les valeurs d'une base de données sqlite, qui est créée et définie dans son DBHelper correspondant. J'ai un presetAdapter qui utilise une vue personnalisée (un textView et un imageButton). Je configure les imageButtons pour qu'ils soient des icônes de suppression qui, lorsqu'on clique dessus, suppriment le textview correspondant de la base de données, remplissent la liste de tableaux avec les valeurs mises à jour, puis se mettent à jour, afin d'afficher la suppression de la valeur.
Je suis en mesure de supprimer correctement la valeur de la base de données, et afin de repeupler et d'actualiser la liste de tableaux et le presetAdapter, j'ai créé une méthode dans presetList appelée refreshList(). Cette méthode devrait gérer cette fonctionnalité, mais lorsque je l'appelle, elle lève une NullPointerException. Plus précisément, il plante lorsque j'essaie d'ouvrir un curseur pour lire les valeurs de ma base de données :
L'erreur:
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)
Voici la liste des préréglages :
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;
}
}
Et voici mon adaptateur :
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, 0 , 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;
}
}
Je suppose qu'il y a un moyen plus simple de s'y prendre qui me manque, ou qu'il existe une solution plus simple. Si quelqu'un pouvait m'éclairer, ce serait très apprécié !
C'était donc beaucoup, beaucoup plus facile que je ne le pensais. Je passais déjà le arrayList dans le arrayAdapter, où je définissais les méthodes onClick. Tout ce que j'avais à faire était de migrer le code de la fonction refreshList() à l'intérieur du onClick dans le arrayAdapter etnotifyDataSetChanged();
La méthode onClick dans mon arrayAdapter ressemble maintenant à ceci :
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);
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();
}
notifyDataSetChanged();
}
});
Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.
En cas d'infraction, veuillez [email protected] Supprimer.
laisse moi dire quelques mots