Kullanıcı girdiyi sildikten sonra liste görünümünü güncellemeye çalışıyorum. notifyDataSetChanged()
'u kullanmam gerektiğini buldum. Ama kullanmak için arrayList'i ilk önce güncellemem gerekiyor (doğru?). Ama bunu değiştiremiyorum çünkü bu liste nihai olarak ilan edildi.update final Dizisi güncellenmeden once arrayAdapter/listView
Son olarak, getView
yönteminde buna ihtiyacım var ve aksi halde Android Studio, bir iç sınıf aracılığıyla erişememekten şikayetçidir.
ilgili kodu:
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;
}
});
}
Kopyala doğru başka bir listeye o listeyi yansıyacaktır böylece arraylist bir öğeyi almak ve işlemi gerçekleştirmek için
arrayAdapter.getItem(position);
kullanmak ve ayarlamak için kullanabilirsiniz bağdaştırıcısı –Bunu 'arrayAdapter.addAll (mydb.getAllAlarms());' veya 'arrayList.clear(); arrayList.addAll (mydb.getAllAlarms()); '. Listeyi değiştirmek için yeniden başlatmaya gerek yoktur. – Titus
@Titus Ah Tam olarak aynı arrayList'i düzenlemek zorunda olmadığını bilmiyordum. Mantıksal görünüyor, bir şekilde listView hala bir 'clear()' ve 'addAll' sonra da güncellemiyor. – PHPirate