0

通話履歴情報(名前、phoneNum、日付と時刻、期間)を含むカスタムリストビューがあります。アイテムをシングルクリックすると、エラーが発生することがあります。

java.lang.IndexOutOfBoundsException:無効なインデックス2、サイズは0です

コードの下にマークされた行に。

アプリは市場に出回っていますが、私はこのエラーに遭遇していません。また、それを作成する方法を考えることもできません。原因を突き止めるために助けが必要です。

これはコードです:

lv1.setOnItemClickListener(new OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> a, View v, int position, long id) {

        Toast.makeText(Calllogs.this, "short click: " + position, Toast.LENGTH_SHORT).show(); 

        if (arr_calllog_name2.size() > 0) arr_calllog_name2.clear();
        if (arr_calllog_phone2.size() > 0) arr_calllog_phone2.clear();
        if (arr_calllog_type2.size() > 0) arr_calllog_type2.clear();
        if (arr_calllog_duration2.size() > 0) arr_calllog_duration2.clear();
        if (arr_calllog_date2.size() > 0) arr_calllog_date2.clear();
        if (arr_calllog_contactid2.size() > 0) arr_calllog_contactid2.clear();

        HotOrNot info2 = new HotOrNot(Calllogs.this);
        info2.open();

        //Some user selected options like view only the incoming, outgoing calls, sort by alphabet or date... 
        LoadView(); 
        LoadSort(); 
        LoadSortBy();

        if (loadedview == 4) {
            if (loadedsortby == 1) //sort by alphabet
            {
                cursorL = info2.getAllTitlesViewSort2Date(loadedsort, d1, d2);
            }
            else if (loadedsortby == 2) //sort by date
            {
                cursorL = info2.getAllTitlesViewSort4Date(loadedsort, d1, d2);
            }
        } else {
            if (loadedsortby == 1) //sort by alphabet
            {
                cursorL = info2.getAllTitlesViewSort1Date(loadedview, loadedsort, d1, d2);
            }
            else if (loadedsortby == 2) //sort by date
            {
                cursorL = info2.getAllTitlesViewSort3Date(loadedview, loadedsort, d1, d2);
            }
        }

         if (cursorL.moveToFirst()){
             do{
                  arr_calllog_name2.add(cursorL.getString(1));
                  arr_calllog_phone2.add(cursorL.getString(2));
                  arr_calllog_type2.add(cursorL.getString(3));
                  arr_calllog_duration2.add(cursorL.getString(4));
                  arr_calllog_date2.add(cursorL.getString(5));
                  arr_calllog_contactid2.add(cursorL.getString(6));
            }while (cursorL.moveToNext());
        }

        info2.close();

        name = arr_calllog_name2.get(position); //error line
        phone = arr_calllog_phone2.get(position);
        type = arr_calllog_type2.get(position);
        duration = arr_calllog_duration2.get(position);
        date = arr_calllog_date2.get(position);
        contactid = arr_calllog_contactid2.get(position);

        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_DIAL);
        intent.setData(Uri.parse("tel:" + phone));
        startActivity(intent);
    }
});

したがって、最初はアイテムのリストビューがあります。ユーザーがアイテムをクリックすると、アクティビティフォースが閉じます。CursorLは、コードの先頭で定義されます(カーソルcursorL)。関数は LoadView(); LoadSort(); LoadSortBy();リストをアルファベットまたは日付でソートし、着信および/または発信コールなどのみを表示します。デフォルト値を設定しているため、最初は値を指定する必要があります。

public void LoadView() {
    sharedPreferences = PreferenceManager
            .getDefaultSharedPreferences(getApplicationContext());
    loadedview = sharedPreferences.getInt("view", 4);
}

public void LoadSort() {
    sharedPreferences = PreferenceManager
            .getDefaultSharedPreferences(getApplicationContext());
    loadedsort = sharedPreferences.getString("sort", "DESC");
}

public void LoadSortBy() {
    sharedPreferences = PreferenceManager
            .getDefaultSharedPreferences(getApplicationContext());
    loadedsortby = sharedPreferences.getInt("sortby", 2);
}

変数は2つのloadedsortby値しか持つことができません:1と2、私はチェックしました。は、loadedview1、2、3、4の4つの値のみを持つことができます。

私が考えることができるのは、cursorLしたがってarr_calllog_name2配列リストがどういうわけか空であるということだけですが、それがどのように可能かはわかりません。

例として、cursorLに入力するクエリの1つを投稿します。

public Cursor getAllTitlesViewSort1Date(int view, String sort, String date1, String date2) {
        return ourDatabase.rawQuery("SELECT * FROM " + DATABASE_TABLE + " WHERE " + KEY_DATE + " BETWEEN '" + date1 + "'" + " AND '" + date2 + "'" + " AND " + KEY_TYPE + " = '" + view + "'" + " ORDER BY " + KEY_NAME + " COLLATE NOCASE " + sort, null);
    }

どんなアイデアでも大歓迎です。

4

1 に答える 1

0

これを使用する代わりに...

if (cursorL.moveToFirst()){
             do{
                  arr_calllog_name2.add(cursorL.getString(1));
                  arr_calllog_phone2.add(cursorL.getString(2));
                  arr_calllog_type2.add(cursorL.getString(3));
                  arr_calllog_duration2.add(cursorL.getString(4));
                  arr_calllog_date2.add(cursorL.getString(5));
                  arr_calllog_contactid2.add(cursorL.getString(6));
            }while (cursorL.moveToNext());
        }

試す

cursorL.getCount()

カウントが0でない場合は、これを実行します...

        cursorL.moveToFirst();
        while(!cursorL.isAfterLast())
        {
            arr_calllog_name2.add(cursorL.getString(1));
                  arr_calllog_phone2.add(cursorL.getString(2));
                  arr_calllog_type2.add(cursorL.getString(3));
                  arr_calllog_duration2.add(cursorL.getString(4));
                  arr_calllog_date2.add(cursorL.getString(5));
                  arr_calllog_contactid2.add(cursorL.getString(6));
            cursorL.moveToNext();
        }
        cursorL.close();
于 2012-08-13T03:10:20.303 に答える