java在更新arrayAdapter/listView之前更新最终列表
我试图在用户删除条目后更新listview。我发现我需要使用notifyDataSetChanged()
。但是要使用它,我需要首先更新arrayList(正确吗?)。但我不能改变这一点,因为该列表已被宣布为最终列表
它是最终版本,因为我需要在getView
方法中使用它,否则Android Studio会抱怨无法通过内部类访问它
有关守则:
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(),
安卓.R.layout.simple_list_item_2, 安卓.R.id.text1, arrayList) {
public View getView(int position, View convertView, ViewGroup parent) {
TextView text1 = (TextView) convertView.findViewById(安卓.R.id.text1);
TextView text2 = (TextView) convertView.findViewById(安卓.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;
}
});
}
# 1 楼答案
您可以使用
arrayAdapter.getItem(position);
从arraylist中获取一个项并执行操作,以便正确反映该项