使用光标对象填充时如何使列表可点击?

发布于 2024-12-12 11:27:52 字数 3013 浏览 2 评论 0原文

我正在开发一个 Android 应用程序来列出存储在浏览器中的书签,并使用光标和光标适配器填充到列表中。我在填充列表时完全没有问题,我的问题全部在于点击。我正在使用 onItemClickListener,当用户单击列表项时,应用程序崩溃。

logcat 输出如下:

10-27 23:54:22.718: ERROR/CursorWindow(315): Bad request for field slot 0,2131034113.    
numRows = 15, numColumns = 12

10-27 23:54:22.738: ERROR/AndroidRuntime(315): java.lang.IllegalStateException: get    
field slot from row 0 col 2131034113 failed

下面是我的代码。

import android.app.Activity;
import android.app.ListActivity;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.Browser;
import android.provider.Browser.BookmarkColumns;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView;



@SuppressWarnings("unused")
public class BookmarksActivity extends ListActivity {
/** Called when the activity is first created. */
@Override   
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);


    Uri bookmarks = Browser.BOOKMARKS_URI;
     final Cursor managedCursor = managedQuery(bookmarks, null, null, null, null );
   // Cursor managedCursor = managedQuery(bookmarks, bookmark, null, null,
BookmarkColumns.TITLE  );

    String[] bookmark = new String[]{
        BookmarkColumns.TITLE,
        BookmarkColumns.URL,
        BookmarkColumns._ID,
        };


    // Bind to our new adapter.


    int[] views = new int[] {R.id.urlTitle, R.id.urlUrl};

    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.main,
managedCursor, bookmark, views);
    this.setListAdapter(adapter);

    //list = (listView)adapter;

   this.getListView().setOnItemClickListener(new OnItemClickListener(){

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                long arg3) {

            // TODO Auto-generated method stub
            Intent i = new Intent(android.content.Intent.ACTION_VIEW,
                    Uri.parse(managedCursor.getString(R.id.urlUrl)));
            startActivity(i);
        }

    });

    getColumnData(managedCursor);


}



//getColumnData will go through the supplied cursor and get the data we need
// in this case webpage titles and urls.
// i will late implement the favicon.
 private void getColumnData(Cursor cur)
 {
    if (cur.moveToFirst()){

        String title;
        String url;

        int titleColumn = cur.getColumnIndex(BookmarkColumns.TITLE);
        int urlColumn = cur.getColumnIndex(BookmarkColumns.URL);

        String imagePath;

        do{
            title = cur.getString(titleColumn);
            url = cur.getString(urlColumn);

            Log.d("+-CURSOR-+", title + " " + url);

        }while(cur.moveToNext());

    }




 }
}

I'm working on an android app to list the bookmarks stored in the browser and populated onto a list using a cursor, and cursor adapter. I've had no problem populating the list at all, my problem is all in the click. I'm using an onItemClickListener and when the user clicks a list item the app crashes.

The logcat out puts this:

10-27 23:54:22.718: ERROR/CursorWindow(315): Bad request for field slot 0,2131034113.    
numRows = 15, numColumns = 12

10-27 23:54:22.738: ERROR/AndroidRuntime(315): java.lang.IllegalStateException: get    
field slot from row 0 col 2131034113 failed

below is my code.

import android.app.Activity;
import android.app.ListActivity;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.Browser;
import android.provider.Browser.BookmarkColumns;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView;



@SuppressWarnings("unused")
public class BookmarksActivity extends ListActivity {
/** Called when the activity is first created. */
@Override   
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);


    Uri bookmarks = Browser.BOOKMARKS_URI;
     final Cursor managedCursor = managedQuery(bookmarks, null, null, null, null );
   // Cursor managedCursor = managedQuery(bookmarks, bookmark, null, null,
BookmarkColumns.TITLE  );

    String[] bookmark = new String[]{
        BookmarkColumns.TITLE,
        BookmarkColumns.URL,
        BookmarkColumns._ID,
        };


    // Bind to our new adapter.


    int[] views = new int[] {R.id.urlTitle, R.id.urlUrl};

    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.main,
managedCursor, bookmark, views);
    this.setListAdapter(adapter);

    //list = (listView)adapter;

   this.getListView().setOnItemClickListener(new OnItemClickListener(){

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                long arg3) {

            // TODO Auto-generated method stub
            Intent i = new Intent(android.content.Intent.ACTION_VIEW,
                    Uri.parse(managedCursor.getString(R.id.urlUrl)));
            startActivity(i);
        }

    });

    getColumnData(managedCursor);


}



//getColumnData will go through the supplied cursor and get the data we need
// in this case webpage titles and urls.
// i will late implement the favicon.
 private void getColumnData(Cursor cur)
 {
    if (cur.moveToFirst()){

        String title;
        String url;

        int titleColumn = cur.getColumnIndex(BookmarkColumns.TITLE);
        int urlColumn = cur.getColumnIndex(BookmarkColumns.URL);

        String imagePath;

        do{
            title = cur.getString(titleColumn);
            url = cur.getString(urlColumn);

            Log.d("+-CURSOR-+", title + " " + url);

        }while(cur.moveToNext());

    }




 }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

伴我心暖 2024-12-19 11:27:52

onItemClick 方法具有参数

AdapterView; 。

我不确定您的 ManagedCursor 在 onItemClick 中使用它时是否已经移动到正确的位置 你可以尝试先调用它的 move 方法

c.moveToPosition(position)

the method onItemClick has the parameters

AdapterView<?> parent, View view, int position, long id

i'm not sure if your managedCursor is already moved to the correct position upon using it inside your onItemClick. you can try calling its move method first

c.moveToPosition(position)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文