2016-10-24 2 views
0

Übersicht: Ich arbeite an einem Projekt namens GPA-Rechner. Dort kann der Benutzer seine Fächer mit Note und Stundenzahl für jedes Thema hinzufügen und GPA berechnen. Ich benutze Fragment für jedes Semester GPA Berechnung.Wiederherstellen von Werten von Spinner in einer benutzerdefinierten Listenansicht nach dem Hinzufügen neuer Listenelement zur Liste

Ich benutze eine benutzerdefinierte Listenansicht für jedes Thema Details. Listenansicht enthält EditText (subject_name), Spinner (grade_earned), Spinner (Credit_hrs_of_subject) und Button (delete_current_row).

Ich benutze eine Schaltfläche, um neue Zeile (Betreff, Note und credit_stunden) der benutzerdefinierten Listenansicht hinzuzufügen.

Eine weitere Schaltfläche zum Berechnen der GPA (Abrufen von Werten aus benutzerdefinierten Listenansichtselementen und Berechnen von GPA).

Bis hier funktioniert mein Code perfekt und ich bekomme die gewünschten Ergebnisse.

Problem: Wenn ich eine Zeile zur Listenansicht hinzufüge und die Werte von Spinnern (Klassen- und Kreditstunden) ändere und dann eine neue Zeile erstelle, werden die Werte der vorherigen Spinner zum ersten Element aktualisiert. OR Durch Scrollen der Liste werden auch die ausgewählten Werte für die Drehfeldelemente entfernt und das erste Element auf allen Drehfeldern angezeigt.

Vielen Dank im Voraus Als ich für die letzten drei Nächte in dieser Frage beschäftigte mich aber nicht, es zu beheben ..

Mein Code:

import android.content.Context; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.ListFragment; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.ImageButton; 
import android.widget.ListView; 
import android.widget.Spinner; 
import android.widget.TextView; 
import android.widget.Toast; 
import java.util.ArrayList; 
import java.util.List; 


public class OneFragment extends ListFragment { 

    public ListView MyListView; 
    public ArrayList<String> TitlesArray = new ArrayList<String>(); 
    ArrayAdapter<String> adapter; 
    int count = 1; 


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

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

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     Button btnAdd = (Button) getView().findViewById(R.id.btnAddSub1); 
     Button btnCalculate= (Button) getView().findViewById(R.id.btnCalculate); 

     MyListView=getListView(); 

     btnAdd.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       TitlesArray.add("Subject " + count++); 
       adapter.notifyDataSetChanged(); 
      } 
     }); 

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

       //get list items data 
       List<String> GradeList = new ArrayList<String>(); 
       List<String> CreditsList = new ArrayList<String>(); 
       for (int i = 0; i < MyListView.getChildCount(); i++) { 

        // Get row's spinner 
        View listItem = MyListView.getChildAt(i); 
        Spinner grades = (Spinner) listItem.findViewById(R.id.spinnerGrades); 

        Spinner CrdHrs = (Spinner) listItem.findViewById(R.id.spinnerCrdHrs); 

        // Get selection 
        String grade = (String) grades.getSelectedItem(); 
        String CreditHrs = (String) CrdHrs.getSelectedItem(); 
        GradeList.add(grade); 
        CreditsList.add(CreditHrs); 
       } 

       //calculating gpa--formula work--working fine 
       String[] gradeArray = GradeList.toArray(new String[0]); 
       String[] CreditsArray = CreditsList.toArray(new String[0]); 
       double addedvals=0; 
       double addCreditsTotol=0; 
       for(int i=0; i<MyListView.getChildCount();i++){ 
       double valxOfgrade= Double.parseDouble(MainActivity.getValueOfGrade(getActivity(),gradeArray[i])); 
       double valxOfcredits= Double.parseDouble(CreditsArray[i]); 
        double multiply=valxOfcredits*valxOfgrade; 
        addedvals+=multiply; 
        addCreditsTotol+=Double.parseDouble(CreditsArray[i]); 

       } 

       double GPAval=addedvals/addCreditsTotol; 

       TextView TVgpa = (TextView) getActivity().findViewById(R.id.TVGPA); 
       TVgpa.setText("Your gpa is : "+String.valueOf(GPAval)); 



      } 
     }); 

     adapter = new MynewAdapter(getActivity(), R.layout.list_view_semester, TitlesArray); 
     setListAdapter(adapter); 

    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_one, container, false); 
     return view; 
    } 

    public class MynewAdapter extends ArrayAdapter<String> { 

     public int layout; 
     public MynewAdapter(Context context, int resource, List<String> objects) { 
      super(context, resource, objects); 
      layout = resource; 
     } 
     boolean delete; 
     Context mContext; 

     @Override 
     public View getView(final int position, View convertView, final ViewGroup parent) { 
      final int pos=position; 
      ViewHolder mainViewHolder = null; 
      mContext = parent.getContext(); 
      LayoutInflater inflater = LayoutInflater.from(getContext()); 
      convertView = inflater.inflate(layout, parent, false); 
      final ViewHolder viewHolder = new ViewHolder(); 

      viewHolder.title = (EditText) convertView.findViewById(R.id.ETsubject); 
      viewHolder.grade = (Spinner) convertView.findViewById(R.id.spinnerGrades); 
      ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(getActivity(),android.R.layout.simple_spinner_item, MainActivity.Grades); 
      dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
      viewHolder.grade.setAdapter(dataAdapter); 
      viewHolder.credits = (Spinner) convertView.findViewById(R.id.spinnerCrdHrs); 
      viewHolder.btnDelete = (ImageButton) convertView.findViewById(R.id.btnDelete); 

      viewHolder.grade.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
       @Override 
       public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
       String str=(String) parent.getItemAtPosition(position); 
        Log.d("values str",String.valueOf(str)); 
       } 

       @Override 
       public void onNothingSelected(AdapterView<?> parent) { 

       } 
      }); 


//delete button 
     viewHolder.btnDelete.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       delete=true; 
       TitlesArray.remove(position); 
       Log.d("focus","delete"); 

       adapter.notifyDataSetChanged(); 

      } 
     }); 

      convertView.setTag(viewHolder); 
      mainViewHolder = (ViewHolder) convertView.getTag(); 
      mainViewHolder.title.setText(getItem(position)); 

      viewHolder.title.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
         @Override 
         public void onFocusChange(View v, boolean hasFocus) { 
/* 
* When focus is lost save the entered value of editText 
*/ 
          if (!hasFocus) { 

           if(delete==true){ 
            delete=false; 
           }else{ 
           String enteredTitle = ((EditText) v).getText().toString(); 
           TitlesArray.set(pos, enteredTitle); 

          } 
         } 

         } 
        }); 


      return convertView; 
     } 

     public class ViewHolder { 
      EditText title; 
      Spinner grade; 
      Spinner credits; 
      ImageButton btnDelete; 
     } 
    } 

} 
+0

Wo speichern Sie die Werte für das ausgewählte Element, das Sie für die Spinnereien haben? Sie verwenden Ansichten erneut, aber Sie speichern die Werte nicht. Sobald Sie benachrichtigt werden, dass der Datensatz geändert wurde, werden alle Elemente neu geladen und Sie verlieren alle Werte für den Drehfeldwert. Sie müssen diese irgendwo speichern. – Shadesblade

+0

Erstellen Sie eine Datenstruktur (eine Zeilenklasse) mit allen Werten für eine Zeile in Ihrem Adapter. Legen Sie dann alle Werte für diese Zeile fest, wenn sie aktualisiert werden. Ihre ArrayAdapter-Klasse sollte wie der neue ArrayAdapter erstellt werden, und das Datenobjekt in Ihrem Adapter sollte ein Row-Objekt sein. Auf diese Weise können Sie alle benötigten Informationen in einer Klasse speichern. – Shadesblade

+0

@Shadesblade Sir ich habe diesen Ansatz auch versucht. und ich speicherte erfolgreich die Werte in arraylist mit Zeilenindex von jedem Dreher. Aber ich weiß nicht, wie ich diese alten Werte, die in Arraylist gespeichert sind, abrufen kann. Wie und wo würde ich den Abrufcode schreiben ... –

Antwort

0

nach langer Suche endlich i habe die Lösung meines Problems gefunden. hier ist der Link von der Antwort, die ich Answer here

Meine aktualisierten Code gefolgt:

import android.content.Context; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.ListFragment; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.ImageButton; 
import android.widget.ListView; 
import android.widget.Spinner; 
import android.widget.TextView; 
import android.widget.Toast; 

import java.util.ArrayList; 
import java.util.List; 


public class OneFragment extends ListFragment { 

    public ListView MyListView; 
    public ArrayList<String> TitlesArray = new ArrayList<String>(); 
    ArrayAdapter<String> adapter; 
    int count = 1; 

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

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



    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     Button btnAdd = (Button) getView().findViewById(R.id.btnAddSub1); 
     Button btnCalculate= (Button) getView().findViewById(R.id.btnCalculate); 
     final EditText etSubs= (EditText) getView().findViewById(R.id.ETnoOfSubs); 

     MyListView=getListView(); 

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

      int subs= Integer.parseInt(etSubs.getText().toString()); 

       for(int i=0;i<subs;i++) { 
        TitlesArray.add("Subject " + count++); 
       } 
       adapter.notifyDataSetChanged(); 
      } 
     }); 

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

       //get list items data 
       List<String> GradeList = new ArrayList<String>(); 
       List<String> CreditsList = new ArrayList<String>(); 
       for (int i = 0; i < MyListView.getChildCount(); i++) { 

        // Get row's spinner 
        View listItem = MyListView.getChildAt(i); 
        Spinner grades = (Spinner) listItem.findViewById(R.id.spinnerGrades); 

        Spinner CrdHrs = (Spinner) listItem.findViewById(R.id.spinnerCrdHrs); 

        // Get selection 
        String grade = (String) grades.getSelectedItem(); 
        String CreditHrs = (String) CrdHrs.getSelectedItem(); 
        GradeList.add(grade); 
        CreditsList.add(CreditHrs); 
       } 

       //calculating gpa--formula work--working fine 
       String[] gradeArray = GradeList.toArray(new String[0]); 
       String[] CreditsArray = CreditsList.toArray(new String[0]); 
       double addedvals=0; 
       double addCreditsTotol=0; 
       for(int i=0; i<MyListView.getChildCount();i++){ 
       double valxOfgrade= Double.parseDouble(MainActivity.getValueOfGrade(getActivity(),gradeArray[i])); 
       double valxOfcredits= Double.parseDouble(CreditsArray[i]); 
        double multiply=valxOfcredits*valxOfgrade; 
        addedvals+=multiply; 
        addCreditsTotol+=Double.parseDouble(CreditsArray[i]); 

       } 

       double GPAval=addedvals/addCreditsTotol; 

       TextView TVgpa = (TextView) getActivity().findViewById(R.id.TVGPA); 
       TVgpa.setText("Your gpa is : "+String.valueOf(GPAval)); 
      } 
     }); 

     adapter = new MynewAdapter(getActivity(), R.layout.list_view_semester, TitlesArray); 
     setListAdapter(adapter); 

    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_one, container, false); 
     return view; 
    } 

    public class MynewAdapter extends ArrayAdapter<String> { 

     public int layout; 
     public MynewAdapter(Context context, int resource, List<String> objects) { 
      super(context, resource, objects); 
      layout = resource; 
     } 
     boolean delete; 

     @Override 
     public View getView(final int position, View convertView, final ViewGroup parent) { 

      LayoutInflater inflater = LayoutInflater.from(getContext()); 
      View v = convertView; 
      ViewHolder viewHolder; 
      if(v == null){ 

       v=inflater.inflate(layout, parent,false); 
       viewHolder = new ViewHolder(); 
       viewHolder.title = (EditText) v.findViewById(R.id.ETsubject); 
       viewHolder.grade = (Spinner) v.findViewById(R.id.spinnerGrades); 
       ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(getActivity(),android.R.layout.simple_spinner_item, MainActivity.Grades); 
       dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
       viewHolder.grade.setAdapter(dataAdapter); 
       viewHolder.credits = (Spinner) v.findViewById(R.id.spinnerCrdHrs); 
       viewHolder.btnDelete = (ImageButton) v.findViewById(R.id.btnDelete); 
       v.setTag(viewHolder); 
      }else{ 
       viewHolder = (ViewHolder) v.getTag(); 
      } 
      String s = getItem(position); 
      viewHolder.title.setText(s); 


      viewHolder.grade.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
       @Override 
       public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
       String str=(String) parent.getItemAtPosition(position); 
        Log.d("values str",String.valueOf(str)); 
       } 

       @Override 
       public void onNothingSelected(AdapterView<?> parent) { 

       } 
      }); 


//delete button 
     viewHolder.btnDelete.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       delete=true; 
       TitlesArray.remove(position); 
       Log.d("focus","delete"); 

       adapter.notifyDataSetChanged(); 

      } 
     }); 


      viewHolder.title.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
         @Override 
         public void onFocusChange(View v, boolean hasFocus) { 
/* 
* When focus is lost save the entered value of editText 
*/ 
          if (!hasFocus) { 

           if(delete==true){ 
            delete=false; 
           }else{ 
           String enteredTitle = ((EditText) v).getText().toString(); 
           TitlesArray.set(position, enteredTitle); 
          } 
          } 

         } 
        }); 


      return v; 
     } 

     public class ViewHolder { 
      EditText title; 
      Spinner grade; 
      Spinner credits; 
      ImageButton btnDelete; 
     } 
    } 

} 
Verwandte Themen