Java 在更新arrayAdapter/listView之前更新最终列表
我试图在用户删除条目后更新listview。我发现我需要使用Java 在更新arrayAdapter/listView之前更新最终列表,java,android,listview,android-arrayadapter,Java,Android,Listview,Android Arrayadapter,我试图在用户删除条目后更新listview。我发现我需要使用notifyDataSetChanged()。但是要使用它,我需要首先更新arrayList(正确吗?)。但我不能改变这一点,因为该列表已被宣布为最终列表 它是最终版本,因为我在getView方法中需要它,否则Android Studio会抱怨无法通过内部类访问它 有关守则: final List<String> arrayList = mydb.getAllAlarms(); final L
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(),
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;
}
});
}
final List arrayList=mydb.getAllAlarms();
最终列表timesList=mydb.getAllAlarmTimes();
final ArrayList arrayListID=mydb.getAllAlarmIDs();
布尔isEmpty=false;
if(arrayList.isEmpty()){//default
add(“您没有警报”);
时间列表。添加(“”);
isEmpty=true;
}
//初始化arrayadapter以在listview中显示内容
final ArrayAdapter ArrayAdapter=新的ArrayAdapter(getApplicationContext(),
android.R.layout.simple_list_item_2,android.R.id.text1,arrayList){
公共视图getView(int位置、视图转换视图、视图组父视图){
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));
返回视图;
}
};
最终ListView ListView=(ListView)findViewById(R.id.listView1);
setAdapter(arrayAdapter)//将自定义适配器设置为listview
如果(!isEmpty){//只有在出现报警时才设置clicklistener
//为listview中的项目设置clicklistener
setOnItemClickListener(新的AdapterView.OnItemClickListener(){
//...
});
setOnItemLongClickListener(新的AdapterView.OnItemLongClickListener(){
@凌驾
公共布尔值长单击(AdapterView父项、视图、整型位置、长id){
//首先,找到相应的数据库id
final int idtodelite=arrayListID.get(位置);
//显示对话框
AlertDialog.Builder alert=新建AlertDialog.Builder(
主要活动(本);
警报。设置标题(“删除警报”);
setMessage(“你确定吗?”);
alert.setPositiveButton(“是”,新的DialogInterface.OnClickListener(){
@凌驾
public void onClick(DialogInterface dialog,int which){
mydb.deleteAlarm(idToDelete);
//同时取消警报
ShowAlarm.cancelAlarmIfExists(getApplicationContext(),idToDelete);
dialog.dismise();
}
});
//...
alert.show();
//问题就在这里
//重新加载列表视图
//arrayList=mydb.getAllAlarms();//不可能,因为最终列表
arrayAdapter.clear();
arrayAdapter.addAll(arrayList);
arrayAdapter.notifyDataSetChanged();
//listView.invalidateViews();
//setAdapter(arrayAdapter);
返回true;
}
});
}
您可以使用arrayAdapter.getItem(位置)
要从arraylist中获取项目并执行操作,以便正确反映该项目将该列表复制到另一个列表并使用该列表设置适配器,您可以执行此操作arrayAdapter.addAll(mydb.getAllAlarms())
或arrayList.clear();addAll(mydb.getAllAlarms())代码>。无需重新初始化列表即可更改它。@Titus啊,我不知道您不必编辑完全相同的arrayList。这似乎合乎逻辑,但在执行了clear()
和addAll
之后,listView仍然没有更新。但是为什么不将arrayList设置为全局呢?全局声明arrayList并尝试它的策略,在这里和那里相互投票;)