簡體   English   中英

從兩個可膨脹Edittext arrayLists獲取值並計算值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM