開いたときにリストビューをロードするアプリがありますが、問題がどこにあるかについての手がかりがなく、範囲外の配列インデックスの例外が発生しています。どこかでindex=-1にアクセスしようとしていますが、どこにあるのかわかりません。
アプリはデータベースから宿題情報をロードし、それらをArrayListの個別の宿題オブジェクトに配置してそこからListViewにロードします。例外がどこから来ているのか本当にわかりません。すべてのコードをチェックしました。リストには宿題が1つしかありませんが、アプリを開こうとするとすぐにアプリが開くことを拒否し、強制的に閉じます。これがLogCatの出力です
ありがとう
LogCat出力
01-11 16:38:43.644: E/AndroidRuntime(7267): FATAL EXCEPTION: main
01-11 16:38:43.644: E/AndroidRuntime(7267): java.lang.ArrayIndexOutOfBoundsException: length=29; index=-1
01-11 16:38:43.644: E/AndroidRuntime(7267): at android.text.StaticLayout.calculateEllipsis(StaticLayout.java:738)
01-11 16:38:43.644: E/AndroidRuntime(7267): at android.text.StaticLayout.out(StaticLayout.java:702)
01-11 16:38:43.644: E/AndroidRuntime(7267): at android.text.StaticLayout.generate(StaticLayout.java:410)
01-11 16:38:43.644: E/AndroidRuntime(7267): at android.text.StaticLayout.<init>(StaticLayout.java:140)
01-11 16:38:43.644: E/AndroidRuntime(7267): at android.widget.TextView.makeSingleLayout(TextView.java:5888)
01-11 16:38:43.644: E/AndroidRuntime(7267): at android.widget.TextView.makeNewLayout(TextView.java:5745)
01-11 16:38:43.644: E/AndroidRuntime(7267): at android.widget.TextView.onMeasure(TextView.java:6102)
01-11 16:38:43.644: E/AndroidRuntime(7267): at android.view.View.measure(View.java:15513)
01-11 16:38:43.644: E/AndroidRuntime(7267): at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:645)
01-11 16:38:43.644: E/AndroidRuntime(7267): at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:425)
01-11 16:38:43.644: E/AndroidRuntime(7267): at android.view.View.measure(View.java:15513)
01-11 16:38:43.644: E/AndroidRuntime(7267): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4827)
01-11 16:38:43.644: E/AndroidRuntime(7267): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
01-11 16:38:43.644: E/AndroidRuntime(7267): at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:1052)
01-11 16:38:43.644: E/AndroidRuntime(7267): at android.widget.LinearLayout.onMeasure(LinearLayout.java:590)
01-11 16:38:43.644: E/AndroidRuntime(7267): at android.view.View.measure(View.java:15513)
01-11 16:38:43.644: E/AndroidRuntime(7267): at android.widget.ListView.measureScrapChild(ListView.java:1183)
01-11 16:38:43.644: E/AndroidRuntime(7267): at android.widget.ListView.measureHeightOfChildren(ListView.java:1248)
01-11 16:38:43.644: E/AndroidRuntime(7267): at android.widget.ListView.onMeasure(ListView.java:1158)
01-11 16:38:43.644: E/AndroidRuntime(7267): at android.view.View.measure(View.java:15513)
01-11 16:38:43.644: E/AndroidRuntime(7267): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4827)
01-11 16:38:43.644: E/AndroidRuntime(7267): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
01-11 16:38:43.644: E/AndroidRuntime(7267): at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
01-11 16:38:43.644: E/AndroidRuntime(7267): at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
01-11 16:38:43.644: E/AndroidRuntime(7267): at android.view.View.measure(View.java:15513)
01-11 16:38:43.644: E/AndroidRuntime(7267): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4827)
01-11 16:38:43.644: E/AndroidRuntime(7267): at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
01-11 16:38:43.644: E/AndroidRuntime(7267): at android.view.View.measure(View.java:15513)
01-11 16:38:43.644: E/AndroidRuntime(7267): at android.widget.LinearLayout.measureVertical(LinearLayout.java:847)
01-11 16:38:43.644: E/AndroidRuntime(7267): at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
01-11 16:38:43.644: E/AndroidRuntime(7267): at android.view.View.measure(View.java:15513)
01-11 16:38:43.644: E/AndroidRuntime(7267): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4827)
01-11 16:38:43.644: E/AndroidRuntime(7267): at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
01-11 16:38:43.644: E/AndroidRuntime(7267): at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2176)
01-11 16:38:43.644: E/AndroidRuntime(7267): at android.view.View.measure(View.java:15513)
01-11 16:38:43.644: E/AndroidRuntime(7267): at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1874)
01-11 16:38:43.644: E/AndroidRuntime(7267): at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1089)
01-11 16:38:43.644: E/AndroidRuntime(7267): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1265)
01-11 16:38:43.644: E/AndroidRuntime(7267): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:989)
01-11 16:38:43.644: E/AndroidRuntime(7267): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4351)
01-11 16:38:43.644: E/AndroidRuntime(7267): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
01-11 16:38:43.644: E/AndroidRuntime(7267): at android.view.Choreographer.doCallbacks(Choreographer.java:562)
01-11 16:38:43.644: E/AndroidRuntime(7267): at android.view.Choreographer.doFrame(Choreographer.java:532)
01-11 16:38:43.644: E/AndroidRuntime(7267): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
01-11 16:38:43.644: E/AndroidRuntime(7267): at android.os.Handler.handleCallback(Handler.java:725)
01-11 16:38:43.644: E/AndroidRuntime(7267): at android.os.Handler.dispatchMessage(Handler.java:92)
01-11 16:38:43.644: E/AndroidRuntime(7267): at android.os.Looper.loop(Looper.java:137)
01-11 16:38:43.644: E/AndroidRuntime(7267): at android.app.ActivityThread.main(ActivityThread.java:5039)
01-11 16:38:43.644: E/AndroidRuntime(7267): at java.lang.reflect.Method.invokeNative(Native Method)
01-11 16:38:43.644: E/AndroidRuntime(7267): at java.lang.reflect.Method.invoke(Method.java:511)
01-11 16:38:43.644: E/AndroidRuntime(7267): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
01-11 16:38:43.644: E/AndroidRuntime(7267): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
01-11 16:38:43.644: E/AndroidRuntime(7267): at dalvik.system.NativeStart.main(Native Method)
DBからの読み込み
public ArrayList<HomeworkItem> getHomeworks() {
String[] columns = new String[] { KEY_ROWID, KEY_TITLE, KEY_SUBJECT,
KEY_DUE_DAY, KEY_DUE_MONTH, KEY_DUE_YEAR, KEY_NOTES,
KEY_REMINDER_ONE, KEY_REMINDER_TWO };
Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null, null, null,
null, null);
ArrayList<HomeworkItem> hwks = new ArrayList<HomeworkItem>();
int id = c.getColumnIndex(KEY_ROWID);
int iTitle = c.getColumnIndex(KEY_TITLE);
int iSub = c.getColumnIndex(KEY_SUBJECT);
int iDay = c.getColumnIndex(KEY_DUE_DAY);
int iMonth = c.getColumnIndex(KEY_DUE_MONTH);
int iYear = c.getColumnIndex(KEY_DUE_YEAR);
int iNotes = c.getColumnIndex(KEY_NOTES);
int iOne = c.getColumnIndex(KEY_REMINDER_ONE);
int iTwo = c.getColumnIndex(KEY_REMINDER_TWO);
for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
HomeworkItem h = new HomeworkItem();
h.id = c.getInt(id);
h.title = c.getString(iTitle);
h.subject = c.getString(iSub);
h.day = Integer.parseInt(c.getString(iDay));
h.month = Integer.parseInt(c.getString(iMonth));
h.year = Integer.parseInt(c.getString(iYear));
h.notes = c.getString(iNotes);
h.late = h.isLate();
h.oneDayReminder = Boolean.parseBoolean(c.getString(iOne));
h.twoDayReminder = Boolean.parseBoolean(c.getString(iTwo));
hwks.add(h);
}
return hwks;
}
ListViewアダプタ
public class MyAdapter extends BaseAdapter { // adapter for list
public MyAdapter(Context c) {
}
public int getCount() {
// TODO Auto-generated method stub
Log.d("hwk", hwks.size()+" is the size");
return hwks.size();
}
public Object getItem(int position) {
// TODO Auto-generated method stub
Log.d("hwk", position+" being accessed");
return position;
}
public long getItemId(int position) {
// TODO Auto-generated method stub
Log.d("hwk", position+" being accessed");
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
View v = convertView; // inflate the list
TextView title, subject, dueDate, listLate;
if (v == null) {
LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.list, null);
Log.d("hwk", "v inflated");
}
title = (TextView) v.findViewById(R.id.listTitle); // get the id's
// of fields
subject = (TextView) v.findViewById(R.id.listSubject);
dueDate = (TextView) v.findViewById(R.id.listDueDate);
listLate = (TextView) v.findViewById(R.id.listLate);
Log.d("hwk", "got views");
title.setText(hwks.get(position).title);
subject.setText(hwks.get(position).subject);
String date = hwks.get(position).day + "/"
+ (hwks.get(position).month + 1) + "/"
+ hwks.get(position).year;
dueDate.setText(date);
Log.d("hwk", "some text set");
if (hwks.get(position).late) { // set if they are late or not
if (hwks.get(position).isToday()) {
listLate.setTextColor(Color.rgb(255, 165, 0));
listLate.setText("Due Today!");
} else {
listLate.setTextColor(Color.RED);
listLate.setText("Late");
}
} else {
listLate.setTextColor(Color.GREEN);
listLate.setText("Ongoing");
}
Log.d("hwk", "returning v");
return v;
}
}
編集:また、ListViewは、アプリ内で最初に宿題を追加したときに機能し、ListViewを更新して、宿題を追加します。これが発生したときにメインアクティビティを完全にリロードしているので、アプリを一度閉じた後にそれを開くのに問題があるようです。
編集2:アプリからデータを削除し、新しい宿題を追加しましたが、問題を再現できません。これは何が原因でしょうか。
編集3:検出された問題。それはいくつかのテキストと関係があります。「タイトル」を「二項拡張」に設定すると、宿題が「二項拡張」とも呼ばれていたときのエラーが再現されることがわかりました。その文字列をTextViewに入れようとして、テキストが大きすぎることと関係があるのでしょうか。
TextViewの幅を拡張しましたが、エラーが発生しなくなりました。テキストを拡張すると、再び問題が発生しました。テキストビューがオーバーフローする問題である必要があります。これを停止するために設定できるTextViewプロパティはありますか?