首页 > 解决方案 > 即使满足所有条件,我的应用程序也不会进入 for 循环

问题描述

我正在开发一个应用程序,我希望为此运行一个 for 循环。for 循环位于 listview 适配器内,它基本上运行以从列表的每个条目中获取一些数据(因此是 for 循环)。但是,在调试时,我发现该应用程序从未进入 for 循环,而只是转到其下方给出的“if 语句”。不满足 i == 列表大小的条件,因此它应该运行。为什么?这是代码:

package com.example.taskmasterv3;

import android.content.Context;
import android.icu.text.UFormat;
import android.os.Build;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.PriorityQueue;

public class SubtaskDetailAdapter extends ArrayAdapter<SubtaskPartTwo> {

    private final Context context;
    private ArrayList<SubtaskPartTwo> values;
    public boolean deleted;
    DBHelper dbHelper;
    int ph = 10;
    int pm = 9;
    int pl = 8;
    int th = 3;
    int tm = 2;
    int tl = 1;
    private int totalTime;
    private int x;
    int a;
    int b;
    int c;
    int d;
    int e;
    int f;
    int totaltimeints;
    int ans;

    public SubtaskDetailAdapter(Context context, ArrayList<SubtaskPartTwo> list) {

        //since your are using custom view,pass zero and inflate the custom view by overriding getview

        super(context, 0 , list);
        this.context = context;
        this.values = list;
    }

    @RequiresApi(api = Build.VERSION_CODES.N)
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        //check if its null, if so inflate it, else simply reuse it
        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.task_summary_item, parent, false);
        }

        //use convertView to refer the childviews to populate it with data
        TextView tvSubtaskName = convertView.findViewById(R.id.tvlolitaskname);
        ImageView ivPri = convertView.findViewById(R.id.ivloliPri);
        ImageView ivTime = convertView.findViewById(R.id.ivloliTime);
        TextView tvEstTaskTime = convertView.findViewById(R.id.tvEstTaskTime);
     tvSubtaskName.setText(values.get(position).getSubtaskName());

        // Algorithm

        int totaltime = values.get(position).getEstTaskTime();


         while (values.listIterator().hasNext()){
            totaltimeints += values.listIterator().next().getTime();
        }
    ans = totaltime / totaltimeints;

        if (values.get(position).getPriHigh() == 1)
        {
            ivPri.setImageResource(R.drawable.priority_high);
            values.get(position).setPri(ph);


        }
        if (values.get(position).getPriMed() == 1)
        {
            ivPri.setImageResource(R.drawable.priority_med);
            values.get(position).setPri(pm);
        }
        if (values.get(position).getPriLow() == 1)
        {
            ivPri.setImageResource(R.drawable.priority_low);
            values.get(position).setPri(pl);
        }

        if (values.get(position).getTimeMore() == 1)
        {
            ivTime.setImageResource(R.drawable.time_symbol_more);
            values.get(position).setTime(th);
            int b = ans * th;
            tvEstTaskTime.setText(b + "");
        }
        if (values.get(position).getTimeMed() == 1)
        {
            ivTime.setImageResource(R.drawable.time_symbol_med);
            values.get(position).setTime(tm);
            int b = ans * tm;
            tvEstTaskTime.setText(b + "");
        }
        if (values.get(position).getTimeLess() == 1)
        {
            ivTime.setImageResource(R.drawable.time_symbol_less);
            values.get(position).setTime(tl);
            int b = ans * tl;
            tvEstTaskTime.setText(b + "");
        }

        // THIS IS WHERE I USE SORT
        Collections.sort(values, new TaskComparator());

        //return the view you inflated
        return convertView;
    }


    public void addANewSubTask(SubtaskPartTwo newSubTask) {
        add(newSubTask);
        notifyDataSetChanged();

    }

// this doesnt work yet, fix this bug ! (same on the other adapter)
    @Override
    public int getCount() {
        if (this.values.size()>11)
        {
            return 10;
        }
        else
        {
            return super.getCount();
        }
    }

}

显示列表的活动代码:

package com.example.taskmasterv3;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ListView;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.PriorityQueue;

public class TaskSummary extends AppCompatActivity {

    ListView lvTaskList;
    TextView tvBreak, tvBreakAfterEvery, txt1, txt2, text1, hmm;
    TextView break_duration_mins;
    ArrayList<SubtaskPartTwo> subtaskList = new ArrayList<>();
    String subtname;
    String pri;
    String time;
    int working_hours;
    int working_minutes;
    int totalTime;
    DBHelper dbHelper;
    int timeInts;
    int timeConstant;
    int answer;





    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        getMenuInflater().inflate(R.menu.tasksummary, menu);
        return super.onCreateOptionsMenu(menu);
    }


    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {

        dbHelper.deleteAll();

        if (item.getItemId() == R.id.restore) {
            Intent inti = new Intent(this, TaskInfo.class);
            startActivity(inti);

        }



        return super.onOptionsItemSelected(item);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_task_summary);






        lvTaskList = findViewById(R.id.lvTaskList);
        tvBreak = findViewById(R.id.tvBreak);
        tvBreakAfterEvery = findViewById(R.id.tvBreakAfterEvery);
        txt1 = findViewById(R.id.txt1);
        txt2 = findViewById(R.id.txt2);
        break_duration_mins = findViewById(R.id.break_duration_mins);
        text1 = findViewById(R.id.text1);
        hmm = findViewById(R.id.hmm);
        dbHelper = new DBHelper(this);

        working_hours = getIntent().getIntExtra("working_hours", 1);
        working_minutes = getIntent().getIntExtra("working_minutes", 0);
        int alol = working_hours * 60;
        int blol = working_minutes;
        totalTime = alol + blol;
        double without_break_hours = getIntent().getIntExtra("without_break_hours", 1);
        double without_break_minutes = getIntent().getIntExtra("without_break_minutes", 0);
        double break_duration = getIntent().getIntExtra("break_duration", 20);
        String a = working_hours + " h";
        txt1.setText(a);
        String b = working_minutes + " m";
        break_duration_mins.setText(b);
        String c = break_duration + " m";
        txt2.setText(c);



        //Mathematics

        double g = working_hours * 100;
        double h = g + working_minutes;
        double i = h + break_duration;
        double j = i / 60;
        double p = (int) j;
        double q = j - p;
        double r = q * 60;

        without_break_hours = p;
        without_break_minutes = r;

        String d = without_break_hours + " h";
        String e = without_break_minutes + " m";

        text1.setText(d);
        hmm.setText(e);

        

        Cursor res = dbHelper.getdata();
        SubtaskDetailAdapter adapter = new SubtaskDetailAdapter(this, subtaskList);
        lvTaskList.setAdapter(adapter);

        

        while (res.moveToNext() && res != null){
            for (int i1 = 0; i1 < adapter.getCount(); i1++ ){
                timeInts += adapter.getItem(i1).getTime();
            }

            timeConstant = totalTime/timeInts;


            for (int i2 = 0; i2 < adapter.getCount(); i2++){
                answer = timeConstant * adapter.getItem(i2).getTime();
            }
            SubtaskPartTwo subtaskPartTwo = new SubtaskPartTwo(res.getString(0), res.getInt(1), res.getInt(2), res.getInt(3), res.getInt(4), res.getInt(5), res.getInt(6), 0, 0, answer);
            //subtaskList.add(subtaskPartTwo);

            adapter.addANewSubTask(subtaskPartTwo);
        }
        


    }



}

标签: javaandroid

解决方案


for 循环的每次迭代之前,程序都会检查条件 ( i == values.size()) 是否满足。因为i等于 0 不等于values.size(),所以该块不会被执行。

你想要更常见的i < values.size()还是可能的i <= values.size()


推荐阅读