Ü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;
}
}
}
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
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
@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 ... –