Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在更新arrayAdapter/listView之前更新最终列表_Java_Android_Listview_Android Arrayadapter - Fatal编程技术网

Java 在更新arrayAdapter/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

我试图在用户删除条目后更新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(),
                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并尝试它的策略,在这里和那里相互投票;)