2016-04-14 20 views
1

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

     } 
+0

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ı –

+0

Bunu 'arrayAdapter.addAll (mydb.getAllAlarms());' veya 'arrayList.clear(); arrayList.addAll (mydb.getAllAlarms()); '. Listeyi değiştirmek için yeniden başlatmaya gerek yoktur. – Titus

+0

@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

cevap

1

bunu

+0

lütfen onu da kabul et –

+0

Elbette, birbirinizi burada ve haklısınız;) – PHPirate