[英]Getting Values from two Inflatable Edittext arrayLists and Calculating Values
我目前正在開發一個程序,其中可以提取兩個可編輯文本並對其進行計算。 因此,我試圖獲取每個值,將它們放入指定的數組列表中,並根據對應的數組計算值,但是由於遇到indexoutofbounds異常,並且我不知道我的代碼是否正常工作,我遇到了麻煩。 我可以幫忙嗎?
這是我的代碼。
public class CalculateActivity extends AppCompatActivity {
Button calculate;
LinearLayout courses;
ArrayList<Course> coursesList;
SemesterDatabase db;
TextView gpa;
int percentage = 0;
int hundredth =0;
float averageGrade = 0.0f;
float[] gradePoints = new float[]{};
ArrayList<Float> gradesList = new ArrayList();
ArrayList<Float> scoreList = new ArrayList();
ArrayList<Float> totalList = new ArrayList();
int id;
TextView semester;
class C03171 implements OnClickListener {
C03171() {
}
public void onClick(View view) {
float gradePointsCalc = 0.0f;
float totalCrdtHrs = 0.0f;
//編輯Jyoti JK,謝謝您的幫助
for (int x = 0; x < scoreList.size()&& x<totalList.size(); x++)
{CalculateActivity.this.gradesList.add(scoreList.get(x) / totalList.get(x));
}
for (int i = 0; i < CalculateActivity.this.coursesList.size(); i++) {
int crdtHrs = ((Course) CalculateActivity.this.coursesList.get(i)).getCreditHours();
totalCrdtHrs += (float) crdtHrs;
averageGrade += (((Float)CalculateActivity.this.gradesList.get(i).floatValue())*(((Course) CalculateActivity.this.coursesList.get(i)).getCreditHours())/totalCrdtHrs);
}
float gpaCalc = averageGrade;
CalculateActivity.this.gpa.setText(String.format("%.3f", new Object[]{Float.valueOf(gpaCalc)}));
}
}
class C03194 implements DialogInterface.OnClickListener {
C03194() {
}
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.cancel();
}
}
class C03205 implements DialogInterface.OnClickListener {
C03205() {
}
public void onClick(DialogInterface dialogInterface, int i) {
CalculateActivity.this.db.deleteSemester(CalculateActivity.this.id);
CalculateActivity.this.db.deleteAllCourses(CalculateActivity.this.id);
CalculateActivity.this.onBackPressed();
}
}
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView((int) R.layout.activity_calculate);
setSupportActionBar((Toolbar) findViewById( R.id.toolbar));
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setTitle((CharSequence) "Calculate GPA");
this.db = new SemesterDatabase(this);
this.id = getIntent().getIntExtra("semesterId", 1);
this.coursesList = this.db.getAllCourses(this.id);
this.semester = (TextView) findViewById(R.id.semester);
this.semester.setText(getIntent().getStringExtra("semesterName"));
this.gpa = (TextView) findViewById(R.id.gpa);
this.calculate = (Button) findViewById(R.id.calculate);
this.courses = (LinearLayout) findViewById(R.id.courses);
addCourses();
this.calculate.setOnClickListener(new C03171());
}
public void addCourses() {
LayoutInflater inflater = LayoutInflater.from(this);
for (int i = 0; i < this.coursesList.size(); i++) {
View v = inflater.inflate(R.layout.item_course, null, false);
this.courses.addView(v);
final int position = CalculateActivity.this.scoreList.size();
final int position2 = CalculateActivity.this.totalList.size();
CalculateActivity.this.scoreList.add(0.0f);
final EditText Score = (EditText) v.findViewById(R.id.Score);
final EditText Total = (EditText) v.findViewById(R.id.Total);
Score.addTextChangedListener(new TextWatcher() {
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
public void afterTextChanged(Editable editable) {
percentage = Integer.parseInt(editable.toString());
float perc = (float) percentage;
CalculateActivity.this.scoreList.set(position, perc);
}
});
Total.addTextChangedListener(new TextWatcher() {
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
public void afterTextChanged(Editable editable) {
hundredth = Integer.parseInt(editable.toString());
float hund = (float) percentage;
CalculateActivity.this.scoreList.set(position, hund);
}
});
}
}
基本上我認為我的代碼正在做的是從
Score.addTextChangedListener(new TextWatcher() {
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
public void afterTextChanged(Editable editable) {
percentage = Integer.parseInt(editable.toString());
float perc = (float) percentage;
CalculateActivity.this.scoreList.set(position, perc);
}
});
Total.addTextChangedListener(new TextWatcher() {
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
public void afterTextChanged(Editable editable) {
hundredth = Integer.parseInt(editable.toString());
float hund = (float) percentage;
CalculateActivity.this.scoreList.set(position, hund);
}
});
並將價值帶到
for (int x = 0; x < scoreList.size(); x++)
{
ArrayList<Float> finalscore = new ArrayList();
finalscore.add(scoreList.get(x) / totalList.get(x));
for (int j = 0; j < finalscore.size(); j++)
{
CalculateActivity.this.gradesList.add(finalscore.get(j));
}
}
最后使用
for (int i = 0; i < CalculateActivity.this.coursesList.size(); i++) {
averageGrade += ((Float)CalculateActivity.this.gradesList.get(i).floatValue())*(((Course) CalculateActivity.this.coursesList.get(i)).getCreditHours());
}
float gpaCalc = averageGrade;
CalculateActivity.this.gpa.setText(String.format("%.3f", new Object[]{Float.valueOf(gpaCalc)}));
但是我絕對不知道哪里出了問題,也不知道如何去哪里出了問題。 我希望詳細評論!
哦,這是錯誤日志。
FATAL EXCEPTION: main
Process: com.example.joon.chadwickgrades, PID: 19395
java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.get(ArrayList.java:411)
at com.example.joon.chadwickgrades.CalculateActivity$C03171.onClick(CalculateActivity.java:66)
at android.view.View.performClick(View.java:5623)
at android.view.View$PerformClick.run(View.java:22433)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6247)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:872)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:762)
作為您的代碼,
for (int x = 0; x < scoreList.size(); x++)
{
ArrayList<Float> finalscore = new ArrayList();
finalscore.add(scoreList.get(x) / totalList.get(x));
for (int j = 0; j < finalscore.size(); j++)
{
CalculateActivity.this.gradesList.add(finalscore.get(j));
}
}
對於每次迭代,
1.您正在創建一個Finalscore arraylist對象。
2.並僅添加一個元素。
3.然后內部for循環開始。 總決賽的人數總是1。 並將其添加到gradesList。
我認為您可以將其更改為
for (int x = 0; x < scoreList.size() && x<totalList.size(); x++)
{
CalculateActivity.this.gradesList.add(scoreList.get(x) / totalList.get(x));
}
然后更改代碼,
for (int i = 0; i < CalculateActivity.this.coursesList.size() && i <CalculateActivity.this.gradesList.size(); i++) {
int crdtHrs = ((Course) CalculateActivity.this.coursesList.get(i)).getCreditHours();
totalCrdtHrs += (float) crdtHrs;
averageGrade += (((Float)CalculateActivity.this.gradesList.get(i).floatValue())*(((Course) CalculateActivity.this.coursesList.get(i)).getCreditHours())/totalCrdtHrs);
}
編輯:
關鍵是,無論何時從列表中獲取數據,都需要檢查它是否為null以及大小。 避免例外的最佳做法
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.