【问题标题】:How do I update a SQLite row from a ListView item?如何从 ListView 项更新 SQLite 行?
【发布时间】:2017-07-26 21:57:02
【问题描述】:

我有一个使用 sqlite 的应用程序,它存储有关硬件商店项目的信息并将它们显示在 ListView 中,这个列表视图显示项目的名称、价格、数量和供应商。每个列表项也有一个 Sell 按钮,当我单击该按钮时,它应该从该特定项目的数量中减去 1 并更新数据库,但由于该按钮是在 CursorAdapter 中创建的,我不确定如何访问数据库和更新它。

这是我的 CursorAdapter:

package com.example.android.inventoryapp;

import android.content.Context;
import android.database.Cursor;
import android.support.v4.widget.CursorAdapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.example.android.inventoryapp.data.InventoryContract.InventoryEntry;


public class InventoryCursorAdapter extends CursorAdapter {


    public InventoryCursorAdapter(Context context, Cursor cursor) {
        super(context, cursor, 0);
    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        return LayoutInflater.from(context).inflate(R.layout.list_item, parent, false);
    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {

        TextView itemNameView = view.findViewById(R.id.item_name);
        TextView itemPriceView = view.findViewById(R.id.item_price);
        TextView itemQuantityView = view.findViewById(R.id.item_quantity);
        TextView itemSupplierView = view.findViewById(R.id.item_supplier);

        ImageView sellButton = view.findViewById(R.id.sell_button);

        int nameColumnIndex = cursor.getColumnIndex(InventoryEntry.COLUMN_ITEM_NAME);
        int priceColumnIndex = cursor.getColumnIndex(InventoryEntry.COLUMN_ITEM_PRICE);
        int quantityColumnIndex = cursor.getColumnIndex(InventoryEntry.COLUMN_ITEM_QUANTITY);
        int supplierColumnIndex = cursor.getColumnIndex(InventoryEntry.COLUMN_ITEM_SUPPLIER);

        int quantity = cursor.getInt(quantityColumnIndex);

        String name = cursor.getString(nameColumnIndex);
        String price = String.valueOf(cursor.getInt(priceColumnIndex)) + context.getString(R.string.currency_symbol);
        String quantityStr = String.valueOf(quantity);
        String supplier = cursor.getString(supplierColumnIndex);

        itemNameView.setText(name);
        itemPriceView.setText(price);
        itemQuantityView.setText(quantityStr);
        itemSupplierView.setText(supplier);

    }

}

【问题讨论】:

    标签: android sqlite android-contentprovider


    【解决方案1】:

    在包含适配器引用的 Activity 中,创建一个类似于以下内容的内部类:

      public class MyClickListener {
        public void handleClick(Item item) {
          // access your DB here, {item} is available if you need the data
        }
      }
    

    然后当你创建你的适配器时

    myAdapter = new InventoryCursorAdapter(context, cursor, new MyClickListener());
    

    在您的适配器中保存对该点击侦听器的引用。

    然后在adapter的BindView方法中(如果需要item数据更新数据库,通过点击监听传递)

    sellButton.setOnClickListener(new View.OnClickListener() {
       @Override
       public void onClick(View v) {
          Item item = myItemSet.get(position);
          myListener.handleClick(item);
       }
    });
    

    【讨论】:

    • 我现在的问题是我只能更改我第一次点击的ListItem,我不知道怎么知道sellButton属于哪个ListItem
    • 如果您需要一种特定的方式来识别信息,您可能需要在 handleClick() 中传递其他信息,但是由于您在 handleClick() 中传递每个特定光标的数据,因此您似乎应该有你需要的一切。
    • 是的,我的问题是检索列表项的 id,但是我将适配器中的视图传递到句柄单击中,然后获取父视图,然后获取 id,谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多