【问题标题】:Force close when taping on a marker在标记上粘贴时强制关闭
【发布时间】:2011-08-24 20:55:52
【问题描述】:

我有这段代码可以在点击标记时显示 AlertDialog:

public void showOverlay (OverlayItem overlay)
        {
        db = openHelper.getWritableDatabase();

        String[] columns_descri = new String[] {COL_DESCRI};

        Cursor cur = db.query(true, TABLE_COORD, columns_descri,null, null, null, null, null, null);

        String description = cur.getString(cur.getColumnIndexOrThrow(COL_DESCRI));
        AlertDialog.Builder dialog = new AlertDialog.Builder(Geo.this);
        dialog.setTitle("Infos.");
        dialog.setMessage(description);
        dialog.setPositiveButton("OK", new OnClickListener() {    
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        });
        dialog.show();
        db.close();


    }

        @Override
        public boolean onTap(int index)

        {
 showOverlay(getItem(index)) ;
 return super.onTap(index) ;
 }

奇怪的是我有一个带有 logcat 错误的 FC:

08-24 20:51:42.466: ERROR/AndroidRuntime(265): Uncaught handler: thread main exiting due to uncaught exception
08-24 20:51:42.486: ERROR/AndroidRuntime(265): android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 4

有什么想法吗? 谢谢。

【问题讨论】:

标签: android sqlite google-maps google-maps-markers


【解决方案1】:

当第一次创建游标时,它的索引是-1(在列表的开头之前)。在尝试从中检索任何数据之前,您需要调用 cur.moveToFirst()。如果光标为空,moveToFirst() 也会返回 false,这可能很有用:

public void showOverlay (OverlayItem overlay, int index)
{
   db = openHelper.getWritableDatabase();

   String[] columns_descri = new String[] {COL_DESCRI};

   Cursor cur = db.query(true, TABLE_COORD, columns_descri,null, null, null, null, null, null);

   if (cur.moveToPosition(index)) {
         String description = cur.getString(cur.getColumnIndexOrThrow(COL_DESCRI));
         AlertDialog.Builder dialog = new AlertDialog.Builder(Geo.this);
         dialog.setTitle("Infos.");
         dialog.setMessage(description);
         dialog.setPositiveButton("OK", new OnClickListener() {    
             @Override
             public void onClick(DialogInterface dialog, int which) {
                 dialog.dismiss();
             }
         });
         dialog.show();
   }
   else {
        //ERROR!  cursor is empty, throw a toast or something
   }

   db.close();
}

【讨论】:

  • 我使用建议的解决方案编辑了我的代码,但我有 4 个警报对话框显示相同的描述。我认为它只是读取第一个索引并将其显示为我在“描述”列中的条目数,在我的情况下,4。请问还有其他想法吗?
  • 保留您所在位置的索引并改用cur.moveToPosition()。或者,您可以在每次使用后致电cur.moveToNext()。我将使用moveToNext() 代码更新代码。
  • 代码只有在你想连续显示 4 个不同的对话框时才有效,但如果你想显示一个特定的对话框,你应该运行一个更好、更独特的查询或者传入您要用于对话框的行的索引作为moveToPosition() 的参数。如果问题是您的代码显示了 4 个警报对话框,而不仅仅是 1 个,则错误不在发布的代码中,而是来自其他地方。不过,我不完全确定您在评论中的意思。
  • 我正在更改代码以显示您将如何通过传入索引和使用 moveToPosition() 来使用该函数。
  • :( 哦,天哪,我完全按照你说的做,同样的问题。我解释说:当我点击一个标记时,我会同时显示 6 个具有相同描述的警报对话框. 不知道为什么,它不在循环中:\
猜你喜欢
  • 1970-01-01
  • 2013-02-13
  • 1970-01-01
  • 1970-01-01
  • 2013-11-09
  • 1970-01-01
  • 2015-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多