2016-04-14 25 views
1

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; 
       } 
      }); 

     } 
+0

Kopie diese Liste reflektiert wird und verwenden zu setzen adapter –

+0

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

+0

@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

Antwort

1

Sie arrayAdapter.getItem(position); verwenden können, ein Element aus dem Arraylist zu erhalten und den Betrieb auszuführen, so dass es korrekt in einer anderen Liste

+0

bitte upvote es auch –

+0

Sicher, Upvoting hier und da ist verdient;) – PHPirate

Verwandte Themen