java - 即使满足所有条件,我的应用程序也不会进入 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);
}
}
}
解决方案
在for 循环的每次迭代之前,程序都会检查条件 ( i == values.size()
) 是否满足。因为i
等于 0 不等于values.size()
,所以该块不会被执行。
你想要更常见的i < values.size()
还是可能的i <= values.size()
?
推荐阅读
- keras - 在 keras 中连接四个 CNN 模型
- powershell - 需要对 Web 请求响应中的值进行排序
- javascript - Javascript 函数返回对象,其中包含 3 个函数定义,但 IntelliSense 不适用于该返回类型
- jestjs - Jest tests crash when due to @babylon/core es6 syntax
- java - 尝试在 Android Studio 中成功运行项目?
- python - pytrends 返回“请求”KeyError
- flutter - Flutter:将列中文本的宽度限制为其他子项的宽度
- reactjs - Strapi 没有在 GraphQL 上显示两种内容类型
- r - 如何使用因子变量作为ggplot2的背景颜色进行绘图?
- javascript - 当值在使用nodejs的对象中包含空时如何获取键名