Ich versuche, eine Listview zu aktualisieren, nachdem der Benutzer einen Eintrag gelöscht hat. Ich fand, dass ich notifyDataSetChanged()
verwenden musste. Aber um das zu verwenden, muss ich zuerst die ArrayList aktualisieren (richtig?). Aber ich kann das nicht ändern, weil diese Liste als endgültig erklärt wird.Aktualisieren der endgültigen Liste vor dem Aktualisieren von ArrayAdapter/listView
Es ist endgültig, weil ich es in der getView
Methode brauche und ansonsten beschwert sich Android Studio, dass es nicht über eine innere Klasse darauf zugreifen kann.
Der entsprechende Code:
final List<String> arrayList = mydb.getAllAlarms();
final List<String> timesList = mydb.getAllAlarmTimes();
final ArrayList<Integer> arrayListID = mydb.getAllAlarmIDs();
boolean isEmpty = false;
if (arrayList.isEmpty()) { //default
arrayList.add("You have no alarms");
timesList.add("");
isEmpty = true;
}
//initialise arrayadapter to show stuff in the listview
final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(getApplicationContext(),
android.R.layout.simple_list_item_2, android.R.id.text1, arrayList) {
public View getView(int position, View convertView, ViewGroup parent) {
TextView text1 = (TextView) convertView.findViewById(android.R.id.text1);
TextView text2 = (TextView) convertView.findViewById(android.R.id.text2);
text1.setText(arrayList.get(position));
text2.setText(timesList.get(position));
return convertView;
}
};
final ListView listView = (ListView) findViewById(R.id.listView1);
listView.setAdapter(arrayAdapter); //set our custom adapter to the listview
if (!isEmpty) { //only set clicklistener if there are alarms
//set clicklistener for items in the listview
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
//...
});
listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
//first, find the corresponding database id
final int idToDelete = arrayListID.get(position);
//show dialog
AlertDialog.Builder alert = new AlertDialog.Builder(
MainActivity.this);
alert.setTitle("Delete alarm");
alert.setMessage("Are you sure?");
alert.setPositiveButton("YES", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
mydb.deleteAlarm(idToDelete);
//cancel alarm as well
ShowAlarm.cancelAlarmIfExists(getApplicationContext(), idToDelete);
dialog.dismiss();
}
});
//...
alert.show();
//PROBLEM LIES HERE
//reload listview
// arrayList = mydb.getAllAlarms(); //not possible because final List
arrayAdapter.clear();
arrayAdapter.addAll(arrayList);
arrayAdapter.notifyDataSetChanged();
// listView.invalidateViews();
// listView.setAdapter(arrayAdapter);
return true;
}
});
}
Kopie diese Liste reflektiert wird und verwenden zu setzen adapter –
Sie können dies tun 'arrayAdapter.addAll (mydb.getAllAlarms());' oder 'arrayList.clear(); arrayList.addAll (mydb.getAllAlarms()); '. Es ist nicht notwendig, die Liste neu zu initialisieren, um sie zu ändern. – Titus
@Titus Ah Ich wusste nicht, dass Sie die exakt gleiche ArrayList nicht bearbeiten müssen. Es erscheint logisch, irgendwie aktualisiert sich das listView nach einem 'clear()' und 'addAll' trotzdem nicht. – PHPirate