使用数据库填充列表视图

Populating a list view with from a Database

所以我的问题是我创建了一个列表视图并使用一个简单的游标适配器填充它。所以现在当我单击列表视图上的一个项目时,它会将我带到另一个 activity,它应该向我显示我单击的项目的详细信息。解决这个问题的最佳方法是什么?这是我填充列表视图的功能。我到底应该发送什么给下一个 activity?我正在考虑发送位置,但那行不通,因为在接下来的 activity 中,我将不得不使用该位置访问数据库,但这不准确,因为数据库可能删除了行,这可能 return我是另一行数据。任何想法将不胜感激。

private void populateListView(){

    Cursor cursor = myDatabase.getAllData();
    String[] fromfieldNames = new String[]{StudentDBOpenHelper.ITEM_NAME_COLUMN};
    int[] toViewIDs = new int[] {R.id.textView_itemName};
    SimpleCursorAdapter myCursorAdapter;
    myCursorAdapter = new SimpleCursorAdapter(getActivity(),
            R.layout.indvidualview_layout,cursor,fromfieldNames,toViewIDs,0);
    ListView myList = (ListView) getActivity().findViewById(R.id.courseListXML);
    myList.setAdapter(myCursorAdapter);


    myList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {


            Intent nextActivity = new Intent(getActivity(), CourseWorkItemActivity.class);

            nextActivity.putExtra("Item", position);

            startActivity(nextActivity);

        }
    });
}

我建议发送从游标中提取的数据作为附加意图。这是一个示例(比您想要的稍微复杂一些,如 Itemclick 我显示一个中间对话框以显示 select 编辑或库存(将产品放入商店的过道)选项。:-

productlist_csr = shopperdb.getProductsAsCursor();
        currentpca = new ProductsCursorAdapter(this, productlist_csr, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
        productlistview.setAdapter(currentpca);

        productlistview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                AlertDialog.Builder okdialog = new AlertDialog.Builder(productlistview_context);
                okdialog.setTitle(R.string.productlistentryclicktitle);
                okdialog.setMessage(R.string.productlistentryclickmessage001);
                okdialog.setCancelable(true);
                final int pos = position;
                okdialog.setNegativeButton(R.string.standardstockproductlist, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Intent intent = new Intent(productlistview_context, AddProductToShopActivity.class);
                        productlist_csr.moveToPosition(pos);
                        intent.putExtra("Caller", THIS_ACTIVITY);
                        intent.putExtra("PRODUCTID", productlist_csr.getLong(ShopperDBHelper.PRODUCTS_COLUMN_ID_INDEX));
                        intent.putExtra("ProductName", productlist_csr.getString(ShopperDBHelper.PRODUCTS_COLUMN_NAME_INDEX));
                        intent.putExtra("ProductNotes", productlist_csr.getString(ShopperDBHelper.PRODUCTS_COLUMN_NOTES_INDEX));
                        startActivity(intent);
                        dialog.cancel();
                    }
                });
                okdialog.setPositiveButton(R.string.standardedittext, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Intent intent = new Intent(productlistview_context, ProductAddActivity.class);
                        intent.putExtra("Caller", THIS_ACTIVITY + "Update");
                        productlist_csr.moveToPosition(pos);
                        intent.putExtra("ProductName", productlist_csr.getString(ShopperDBHelper.PRODUCTS_COLUMN_NAME_INDEX));
                        intent.putExtra("ProductNotes", productlist_csr.getString(ShopperDBHelper.PRODUCTS_COLUMN_NOTES_INDEX));
                        intent.putExtra("PRODUCTID", productlist_csr.getLong(ShopperDBHelper.PRODUCTS_COLUMN_ID_INDEX));
                        startActivity(intent);
                        dialog.cancel();
                    }
                });
                okdialog.setNeutralButton(R.string.standardbacktext, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.cancel();
                    }
                });
                okdialog.show();
            }
        });

注意! ShopperDBHelper.PRODUCTS_COLUMN_?????_INDEX 等于相应列在游标中的偏移量。我使用 Extra Caller 的意图来通知呼叫 activity 的开始 activity(例如,可以从产品、商店或过道调用 Stock)所以它可以采取相应的行动。

在上面position用于移动到相应的光标行(但是,我认为这实际上并不需要,因为光标已经定位,但是以防万一).

我也使用自定义光标,但我认为这不应该成为问题(我从未使用过 simpleCursor)。