2016-03-18 6 views
0

Мое приложение является ViewPager с Fragments и вкладками вверху. У меня есть 4 раздела, из которых 2 из них разделяют 2 значения int и float, хранящиеся в SharedPreferences.Обновить фрагмент при удалении элементов ListView

В одном из этих фрагментов можно взять данные из БД и показать в ListView! Когда я добавляю данные, у меня нет проблем, изменения sharedpreferences и TextView устанавливаются с новым значением.

Проблема возникает, когда я удаляю элемент из ListView. У этого ListView есть кнопка внутри «X» для удаления строки, когда я ее удаляю, я пересчитываю новое среднее значение и сохраняю его в SharedPreferences, но значения в TextView не изменяются с новым результатом!

Здесь адаптер

public class VotiEsamiAdapter extends ArrayAdapter<VotiEsami> { 

    public MySQLiteHelper db; 
    private List<VotiEsami> searchArrayList; 
    private List<VotiEsami> esami_tot; 
    SharedPreferences sharedPref; 


    public VotiEsamiAdapter(Context context, int textViewResourceId, List objects){ 
     super(context, textViewResourceId, objects); 

     searchArrayList = objects; 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent){ 
     LayoutInflater inflater = (LayoutInflater) getContext() 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = inflater.inflate(R.layout.listview_voti_line, null); 

     db = new MySQLiteHelper(getContext()); 

     final TextView nome = (TextView)convertView.findViewById(R.id.text_line_voto_nome); 
     final TextView cfu = (TextView)convertView.findViewById(R.id.text_line_voto_cfu); 
     TextView voto = (TextView)convertView.findViewById(R.id.text_line_voto_valore); 

     VotiEsami m = getItem(position); 

     // inflate other items here : 
     ImageButton delete_row_button = (ImageButton)convertView.findViewById(R.id.delete_button_line_voti); 

     delete_row_button.setOnClickListener(
       new Button.OnClickListener() { 
        @Override 
        public void onClick(View v) { 

         searchArrayList.remove(position); 
         db.deleteSelectedVotoEsame(nome.getText().toString()); 
         notifyDataSetChanged(); 

         //Carico la media pesata e i cfu totale con sharedpreferences 
         sharedPref = getContext().getSharedPreferences("USR_DATA", Context.MODE_PRIVATE); 

         //Aggiorno media e CFU 
         //Get all exams inside database 
         esami_tot = db.getVotiEsami(); 
         float MEDIA_PONDERATA; 
         float media_parziale; 
         float media_sommata_parziale = 0; 
         int CFU_SOMM = 0; 

         if (esami_tot.isEmpty()) { 

          CFU_SOMM = 0; 
          MEDIA_PONDERATA = 0; 
          Toast.makeText(getContext(), "EMPTY!!", Toast.LENGTH_LONG).show(); 

         } else { 

          //Calcolare media totale e CFU totale 
          for (VotiEsami exams : esami_tot) { 

           int voto_temp = exams.get_voto(); 

           if (voto_temp == 31) voto_temp = 30; 
           media_parziale = (voto_temp) * (exams.get_cfu()); 
           CFU_SOMM += exams.get_cfu(); 
           media_sommata_parziale += media_parziale; 

          } 
          MEDIA_PONDERATA = media_sommata_parziale/CFU_SOMM; 

         } 
         //Salvo i dati 
         SharedPreferences.Editor editor = sharedPref.edit(); 
         editor.putFloat("MEDIA", MEDIA_PONDERATA); 
         editor.putInt("CFU", CFU_SOMM); 

        } 

       } 

     ); 

     nome.setText(m.get_nome_esame()); 
     cfu.setText("CFU: " + String.valueOf(m.get_cfu())); 
     if(m.get_voto() == 31) { 

      voto.setText("Voto: " + String.valueOf(m.get_voto()-1) + "L"); 

     }else{ 

      voto.setText("Voto: " + String.valueOf(m.get_voto())); 

     } 

     //Se la media è inferiore al 6 lo scrivo in rosso 
     //altrimenti in verde 
     if(m.get_voto() <= 21) { 

      voto.setTextColor(getContext().getResources().getColor(R.color.rosso)); 

     }else if ((m.get_voto() <= 25) && (m.get_voto() >= 22)){ 

      voto.setTextColor(getContext().getResources().getColor(R.color.giallo)); 

     }else if((m.get_voto() >= 25) && (m.get_voto() <=31)){ 

      voto.setTextColor(getContext().getResources().getColor(R.color.verde)); 

     } 
     return convertView; 
    } 

} 

Здесь фрагмент, управлять и показать эти данные

public class ThreeFragment extends Fragment { 

    SharedPreferences sharedPref; 
    public MySQLiteHelper db; 
    public List<VotiEsami> esami; 
    public VotiEsamiAdapter adapter; //Adapter per caricare la listview di voti 

    public ThreeFragment() { 
     // Required empty public constructor 
    } 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     db = new MySQLiteHelper(getActivity()); 

    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     View view = inflater.inflate(R.layout.fragment_three, container, false); 

     //Carico la media pesata e i cfu totale con sharedpreferences 
     sharedPref = getActivity().getSharedPreferences("USR_DATA", Context.MODE_PRIVATE); 
     int defaultValueInt = 0; 

     float SharedMedia = sharedPref.getFloat("MEDIA", defaultValueInt); 
     int SharedCFU = sharedPref.getInt("CFU", defaultValueInt); 

     TextView media_top = (TextView) view.findViewById(R.id.text_media); 
     TextView cfu_top = (TextView) view.findViewById(R.id.text_tot_cfu); 

     media_top.setText("Media: " + String.valueOf(SharedMedia)); 
     cfu_top.setText("CFU TOT: " + String.valueOf(SharedCFU)); 

     //Find the listview 
     final ListView listView = (ListView)view.findViewById(R.id.voti_listView); 

     //Get all exams inside database 
     esami = db.getVotiEsami(); 
     adapter = new VotiEsamiAdapter(getContext(), R.layout.listview_voti_line, esami); 

     listView.setAdapter(adapter); 

     float MEDIA_PONDERATA; 
     float media_parziale; 
     float media_sommata_parziale = 0; 
     int CFU_SOMM = 0; 

     if(!esami.isEmpty()) { 
      //Calcolare media totale e CFU totale 
      for (VotiEsami exams : esami) { 

       int voto_temp = exams.get_voto(); 

       if (voto_temp == 31) voto_temp = 30; 
       media_parziale = (voto_temp) * (exams.get_cfu()); 
       CFU_SOMM += exams.get_cfu(); 
       media_sommata_parziale += media_parziale; 

      } 
      MEDIA_PONDERATA = media_sommata_parziale/CFU_SOMM; 
     }else{ 

      MEDIA_PONDERATA = 0; 

     } 
     //Salvo i dati 
     SharedPreferences.Editor editor = sharedPref.edit(); 
     editor.putFloat("MEDIA", MEDIA_PONDERATA); 
     editor.putInt("CFU", CFU_SOMM); 

     //TODO gestire cancellazione del voto dal DB e dalla listview 


     Button nuovo_voto = (Button) view.findViewById(R.id.button_add_new_voto); 
     nuovo_voto.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 

       //Start Dialog for input the new vote 
       Intent myIntent = new Intent(getActivity(), DialogAddVotoEsame.class); 
       ThreeFragment.this.startActivityForResult(myIntent, 1); 

      } 
     }); 



     return view; 
    } 

    public void onActivityResult(int requestCode, int resultCode, Intent data) { 

     List<VotiEsami> esami_per_media; 

     if(requestCode == 1) { 
      if (resultCode == Activity.RESULT_OK) { 

       String result_nome = data.getStringExtra("result_name_esame"); //Take the materia from Dialog 
       int result_cfu = data.getIntExtra("result_cfu_esame", 1); //Take the materia from Dialog 
       int result_voto = data.getIntExtra("result_voto_esame", 1); //Take the materia from Dialog 

       //Add exam with vote to DB 
       db.addEsameVoto(new VotiEsami(result_nome, result_cfu, result_voto)); 

       esami_per_media = db.getVotiEsami(); 

       float MEDIA_PONDERATA; 
       float media_parziale; 
       float media_sommata_parziale = 0; 
       int CFU_SOMM = 0; 

       //TODO calcolare media totale e CFU totale 
       for (VotiEsami exams : esami_per_media) { 

        int voto_temp = exams.get_voto(); 
        if(voto_temp == 31) voto_temp = 30; 
        media_parziale = (voto_temp) * (exams.get_cfu()); 
        CFU_SOMM += exams.get_cfu(); 
        media_sommata_parziale += media_parziale; 

       } 
       MEDIA_PONDERATA = media_sommata_parziale/CFU_SOMM; 

       //Salvo i dati 
       SharedPreferences.Editor editor = sharedPref.edit(); 
       editor.putFloat("MEDIA", MEDIA_PONDERATA); 
       editor.putInt("CFU", CFU_SOMM); 
       editor.commit(); 

       TextView media_top = (TextView) getActivity().findViewById(R.id.text_media); 
       TextView cfu_top = (TextView) getActivity().findViewById(R.id.text_tot_cfu); 

       media_top.setText("Media: " + String.valueOf(MEDIA_PONDERATA)); 
       cfu_top.setText("CFU TOT: " + String.valueOf(CFU_SOMM)); 

       //Refresh list 
       List<VotiEsami> newesame = db.getVotiEsami(); 

       //Aggiorno la Listview dell'activity con il nuovo inserimento 
       esami.clear(); 
       esami.addAll(newesame); 
       adapter.notifyDataSetChanged(); 

      } 

     } 
    }//onActivityResult 

} 

Как я могу изменить значения TextView если я удалить один рудные два ряда в ListView? Основная проблема возникает, когда я удаляю, потому что я не могу findViewByIdTextViewFragments в Adapter. Есть ли способ сделать это? Могу ли я найти TextView внутри Fragment от Adapter?

+0

try adapter.notify(); – Fakher

+0

Где, в Фрагменте? – Dario

ответ

0

Просто передайте ссылку на ThreeFragment в VotiAdapter (в конструкторе), а затем используйте его для поиска и замены текста. Для более чистого решения вместо передачи ссылки на фрагмент вы можете определить новый прослушиватель обратного вызова и реализовать его с помощью ThreeFragment. VotiAdapter может вызывать метод этого интерфейса, когда ему нужно сообщить фрагмент изменения статуса.

1

Я думаю, что лучший способ - использовать интерфейс.

Сначала вы должны создать интерфейс и «запуск» событие:

public class VotiEsamiAdapter extends ArrayAdapter<VotiEsami> { 

    private OnDeleteButtonClicked onDeleteButtonClicked; 
    ... 

    public VotiEsamiAdapter(Context context, int textViewResourceId, List objects, OnDeleteButtonClicked onDeleteButtonClicked){ 
     super(context, textViewResourceId, objects); 
     searchArrayList = objects; 
     this.onDeleteButtonClicked = onDeleteButtonClicked; 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent){ 
     ... 
     delete_row_button.setOnClickListener(
       new Button.OnClickListener() { 
        @Override 
        public void onClick(View v) { 

         ... 
         //Salvo i dati 
         SharedPreferences.Editor editor = sharedPref.edit(); 
         editor.putFloat("MEDIA", MEDIA_PONDERATA); 
         editor.putInt("CFU", CFU_SOMM); 

         onDeleteButtonClicked.onDeleteClick(); 
        } 
       } 
     ); 
     ... 
    } 
    ... 
    public interface OnDeleteButtonClicked { 
     void onDeleteClick(); 
    } 

И тогда вы должны реализовать метод в вашем фрагменте:

public class ThreeFragment extends Fragment implements VotiEsamiAdapter.OnDeleteButtonClicked{ 
... 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     ... 
     adapter = new VotiEsamiAdapter(getContext(), R.layout.listview_voti_line, esami, this); 
     ... 
    } 
    ... 
    @Override 
    public void onDeleteClick() { 
     media_top.setText("Media: " + String.valueOf(SharedMedia)); 
     cfu_top.setText("CFU TOT: " + String.valueOf(SharedCFU)); 
    } 
} 

Надеется, что это помогает.

+0

Таким образом, метод delete принадлежит фрагменту, а не адаптером, правильно? – Dario

+0

Технически метод onDeleteClick принадлежит его интерфейсу, и Фрагмент «обязан» реализовать этот метод. – ARP

+0

Я попробую! Благодаря! Если это будет работать, я проверю! – Dario

Смежные вопросы